LookandFeel must be set in headless state as window sizes will be affected
[jalview.git] / src / jalview / bin / Jalview.java
index b1af249..30f91ac 100755 (executable)
-/********************\r
- * 2004 Jalview Reengineered\r
- * Barton Group\r
- * Dundee University\r
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
  *\r
- * AM Waterhouse\r
- *******************/\r
-\r
-\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
+ */\r
 package jalview.bin;\r
 \r
 import jalview.gui.*;\r
+\r
 import javax.swing.*;\r
 \r
+import java.util.Vector;\r
+\r
+\r
+/**\r
+ * Main class for Jalview Application\r
+ * <br>\r
+ * <br>start with java -Djava.ext.dirs=$PATH_TO_LIB$ jalview.bin.Jalview\r
+ *\r
+ * @author $author$\r
+ * @version $Revision$\r
+ */\r
 public class Jalview\r
 {\r
 \r
-   public static void main(String[] args) {\r
-     try{\r
-       UIManager.setLookAndFeel //("javax.swing.plaf.metal.MetalLookAndFeel");\r
-           ( UIManager.getCrossPlatformLookAndFeelClassName() );\r
+    /**\r
+     * main class for Jalview application\r
+     *\r
+     * @param args open <em>filename</em>\r
+     */\r
+    public static void main(String[] args)\r
+    {\r
+      System.out.println("Java version: "+System.getProperty("java.version"));\r
+      System.out.println(System.getProperty("os.arch")+" "\r
+                         +System.getProperty("os.name")+" "\r
+                         +System.getProperty("os.version"));\r
+\r
+\r
+      ArgsParser aparser = new ArgsParser(args);\r
+      boolean headless = false;\r
+\r
+      if( aparser.contains("help") || aparser.contains("h") )\r
+      {\r
+        System.out.println("Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n"\r
+                           +"-nodisplay\tRun Jalview without User Interface.\n"\r
+                           +"-props FILE\tUse the given Jalview properties file instead of users default.\n"\r
+                           +"-annotations FILE\tAdd precalculated annotations to the alignment.\n"\r
+                           +"-features FILE\tUse the given file to mark features on the alignment.\n"\r
+                           +"-fasta FILE\tCreate alignment file FILE in Fasta format.\n"\r
+                           +"-clustal FILE\tCreate alignment file FILE in Clustal format.\n"\r
+                           +"-pfam FILE\tCreate alignment file FILE in PFAM format.\n"\r
+                           +"-msf FILE\tCreate alignment file FILE in MSF format.\n"\r
+                           +"-pileup FILE\tCreate alignment file FILE in Pileup format\n"\r
+                           +"-pir FILE\tCreate alignment file FILE in PIR format.\n"\r
+                           +"-blc FILE\tCreate alignment file FILE in BLC format.\n"\r
+                           +"-jalview FILE\tCreate alignment file FILE in Jalview format.\n"\r
+                           +"-png FILE\tCreate PNG image FILE from alignment.\n"\r
+                           +"-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n"\r
+                           +"-eps FILE\tCreate EPS file FILE from alignment."\r
+            +"\n\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n");\r
+        System.exit(0);\r
+          }\r
+\r
+          Cache.loadProperties(aparser.getValue("props")); // must do this before anything else!\r
+\r
+          if (aparser.contains("nodisplay"))\r
+          {\r
+            System.setProperty("java.awt.headless", "true");\r
+          }\r
+          if (System.getProperty("java.awt.headless") != null\r
+              && System.getProperty("java.awt.headless").equals("true"))\r
+          {\r
+            headless = true;\r
+          }\r
+\r
+          try\r
+          {\r
+            Cache.initLogger();\r
+          }\r
+          catch (java.lang.NoClassDefFoundError error)\r
+          {\r
+            error.printStackTrace();\r
+            System.out.println(\r
+                "\nEssential logging libraries not found."\r
+                +"\nUse: java -Djava.ext.dirs=$PATH_TO_LIB$ jalview.bin.Jalview");\r
+            System.exit(0);\r
+          }\r
+\r
+        Desktop desktop = null;\r
+\r
+\r
+        try\r
+        {\r
+          UIManager.setLookAndFeel(\r
+              UIManager.getSystemLookAndFeelClassName()\r
+              //        UIManager.getCrossPlatformLookAndFeelClassName()\r
+      //"com.sun.java.swing.plaf.gtk.GTKLookAndFeel"\r
+      //"javax.swing.plaf.metal.MetalLookAndFeel"\r
+      //"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"\r
+      //"com.sun.java.swing.plaf.motif.MotifLookAndFeel"\r
+\r
+              );\r
+        }\r
+        catch (Exception ex)\r
+        {}\r
+\r
+          if (!headless)\r
+          {\r
+            desktop = new Desktop();\r
+            desktop.setVisible(true);\r
+            desktop.discoverer.start();\r
+          }\r
+\r
+\r
+         String file = null, protocol = null, format = null, data=null;\r
+         jalview.io.FileLoader fileLoader = new jalview.io.FileLoader();\r
+\r
+          file = aparser.getValue("open");\r
+\r
+          if (file == null && desktop==null)\r
+          {\r
+            System.out.println("No files to open!");\r
+            System.exit(1);\r
+          }\r
+\r
+          if(file!=null)\r
+          {\r
+            System.out.println("Opening file: " + file);\r
+\r
+            if (!file.startsWith("http://"))\r
+            {\r
+              if (! (new java.io.File(file)).exists())\r
+              {\r
+                System.out.println("Can't find " + file);\r
+                if(headless)\r
+                  System.exit(1);\r
+              }\r
+            }\r
+\r
+            protocol = "File";\r
+\r
+            if (file.indexOf("http:") > -1 || file.indexOf("file:") >-1)\r
+            {\r
+              protocol = "URL";\r
+            }\r
+\r
+\r
+\r
+            if (file.endsWith(".jar"))\r
+              format = "Jalview";\r
+            else\r
+              format = new jalview.io.IdentifyFile().Identify(file, protocol);\r
+\r
 \r
-       //   ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");\r
-      // ("com.sun.java.swing.plaf.motif.MotifLookAndFeel" );\r
-     }\r
-     catch (Exception ex)\r
-     {}\r
 \r
-    // JFrame.setDefaultLookAndFeelDecorated(true);\r
-     Desktop frame = new Desktop();\r
-     frame.setResizable(true);\r
-     frame.setVisible(true);\r
+            AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol, format);\r
 \r
+            if(af==null)\r
+            {\r
+              System.out.println("error");\r
+              return;\r
+            }\r
 \r
-     if(args!=null && args.length>0)\r
+            data = aparser.getValue("colour");\r
+            if(data!=null)\r
+            {\r
+              data.replaceAll("%20", " ");\r
+\r
+              jalview.schemes.ColourSchemeI cs =\r
+                  jalview.schemes.ColourSchemeProperty.getColour(af.getViewport().\r
+                  getAlignment(), data);\r
+\r
+              if(cs == null)\r
+              {\r
+                jalview.schemes.UserColourScheme ucs\r
+                    = new jalview.schemes.UserColourScheme("white");\r
+                ucs.parseAppletParameter(data);\r
+                cs = ucs;\r
+              }\r
+\r
+              System.out.println("colour is " + data);\r
+              af.changeColour( cs );\r
+            }\r
+\r
+\r
+            // Must maintain ability to use the groups flag\r
+            data = aparser.getValue("groups");\r
+            if (data != null)\r
+            {\r
+              af.parseFeaturesFile(data, protocol);\r
+              System.out.println("Added "+data);\r
+            }\r
+            data = aparser.getValue("features");\r
+            if (data != null)\r
+            {\r
+              af.parseFeaturesFile(data, protocol);\r
+              System.out.println("Added "+data);\r
+            }\r
+\r
+            data = aparser.getValue("annotations");\r
+            if (data != null)\r
+            {\r
+              af.loadJalviewDataFile(data);\r
+              System.out.println("Added "+data);\r
+            }\r
+\r
+\r
+            String imageName = "unnamed.png";\r
+            while (aparser.getSize() > 1)\r
+            {\r
+              format = aparser.nextValue();\r
+              file = aparser.nextValue();\r
+\r
+              if (format.equalsIgnoreCase("png"))\r
+              {\r
+                af.createPNG(new java.io.File(file));\r
+                imageName = (new java.io.File(file)).getName();\r
+                System.out.println("Creating PNG image: " + file);\r
+                continue;\r
+              }\r
+              else if (format.equalsIgnoreCase("imgMap"))\r
+              {\r
+                af.createImageMap(new java.io.File(file), imageName);\r
+                System.out.println("Creating image map: " + file);\r
+                continue;\r
+              }\r
+              else if (format.equalsIgnoreCase("eps"))\r
+              {\r
+                System.out.println("Creating EPS file: " + file);\r
+                af.createEPS(new java.io.File(file));\r
+                continue;\r
+              }\r
+\r
+              if (af.saveAlignment(file, format))\r
+                System.out.println("Written alignment in " + format +\r
+                                   " format to " + file);\r
+              else\r
+                System.out.println("Error writing file " + file + " in " + format +\r
+                                   " format!!");\r
+\r
+            }\r
+\r
+            while (aparser.getSize() > 0)\r
+            {\r
+              System.out.println("Unknown arg: " + aparser.nextValue());\r
+            }\r
+          }\r
+\r
+        // We'll only open the default file if the desktop is visible.\r
+        // And the user\r
+        //////////////////////\r
+          if (\r
+              !headless\r
+          && file==null\r
+          && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true)\r
+                    )\r
+          {\r
+\r
+            file = jalview.bin.Cache.getDefault("STARTUP_FILE",\r
+                                                "http://www.jalview.org/examples/exampleFile.jar");\r
+\r
+            protocol = "File";\r
+\r
+            if (file.indexOf("http:") > -1)\r
+            {\r
+              protocol = "URL";\r
+            }\r
+\r
+            if (file.endsWith(".jar"))\r
+            {\r
+              format = "Jalview";\r
+            }\r
+            else\r
+            {\r
+              format = new jalview.io.IdentifyFile().Identify(file, protocol);\r
+            }\r
+\r
+            fileLoader.LoadFile(file, protocol, format);\r
+\r
+          }\r
+    }\r
+}\r
+\r
+ class ArgsParser\r
+ {\r
+   Vector vargs = null;\r
+   public ArgsParser(String [] args)\r
+   {\r
+     vargs = new Vector();\r
+     for (int i = 0; i < args.length; i++)\r
      {\r
-         String file = args[0];\r
-         jalview.bin.Cache.LAST_DIRECTORY = file;\r
-         String protocol = "File";\r
-         if(file.indexOf("http:")>-1)\r
-           protocol = "URL";\r
+       String arg = args[i].trim();\r
+       if (arg.charAt(0) == '-')\r
+         arg = arg.substring(1);\r
+       vargs.addElement(arg);\r
+     }\r
+   }\r
 \r
-         String format = jalview.io.IdentifyFile.Identify(file, protocol);\r
+   public String getValue(String arg)\r
+   {\r
+     int index = vargs.indexOf(arg);\r
+     String ret = null;\r
+     if (index != -1)\r
+     {\r
+       ret = vargs.elementAt(index + 1).toString();\r
+       vargs.removeElementAt(index);\r
+       vargs.removeElementAt(index);\r
+     }\r
+     return ret;\r
+   }\r
 \r
-         frame.LoadFile(file, protocol, format);\r
+   public boolean contains(String arg)\r
+   {\r
+     if(vargs.contains(arg))\r
+     {\r
+       vargs.removeElement(arg);\r
+       return true;\r
      }\r
+     else\r
+       return false;\r
+   }\r
 \r
+   public String nextValue()\r
+   {\r
+     return  vargs.remove(0).toString();\r
    }\r
 \r
-}\r
+   public int getSize()\r
+   {\r
+     return vargs.size();\r
+   }\r
+\r
+ }\r