/* * BeautiApp.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.app.beauti; import dr.app.beast.BeastVersion; import dr.app.util.Arguments; import dr.app.util.OSType; import dr.util.Version; import jam.framework.*; import javax.swing.*; import java.awt.*; import java.io.File; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Locale; import java.util.Set; /** * @author Andrew Rambaut * @author Alexei Drummond * @version $Id: BeautiApp.java,v 1.18 2006/09/09 16:07:05 rambaut Exp $ */ public class BeautiApp extends MultiDocApplication { private final static Version version = new BeastVersion(); public BeautiApp(String nameString, String aboutString, Icon icon, String websiteURLString, String helpURLString) { super(new BeautiMenuBarFactory(), nameString, aboutString, icon, websiteURLString, helpURLString); } public static void centreLine(String line, int pageWidth) { int n = pageWidth - line.length(); int n1 = n / 2; for (int i = 0; i < n1; i++) { System.out.print(" "); } System.out.println(line); } public static void printTitle() { System.out.println(); centreLine("BEAUti " + version.getVersionString() + ", " + version.getDateString(), 60); centreLine("Bayesian Evolutionary Analysis Utility", 60); for (String creditLine : version.getCredits()) { centreLine(creditLine, 60); } System.out.println(); } public static void printUsage(Arguments arguments) { arguments.printUsage("beauti", "[<input-file-name> ...]"); System.out.println(); System.out.println(" Example: beauti test.nex"); System.out.println(" Example: beauti -help"); System.out.println(); } // /** // * In a departure from the standard UI, there is no "Open" command for this application // * Instead, the user can create a New window, Import a NEXUS file and Apply a Template file. // * None of these operations result in a file being associated with the DocumentFrame. All // * these actions are located in the BeautiFrame class. This overriden method should never // * be called and throw a RuntimeException if it is. // * // * @return the action // */ // public Action getOpenAction() { // throw new UnsupportedOperationException("getOpenAction is not supported"); // } private static boolean lafLoaded = false; // Main entry point static public void main(String[] args) { // There is a major issue with languages that use the comma as a decimal separator. // To ensure compatibility between programs in the package, enforce the US locale. Locale.setDefault(Locale.US); Arguments arguments = new Arguments( new Arguments.Option[]{ new Arguments.Option("advanced", "Enable advanced & developer features"), new Arguments.Option("version", "Print the version and credits and stop"), new Arguments.Option("help", "Print this information and stop"), }); int argumentCount = 0; try { argumentCount = arguments.parseArguments(args); } catch (Arguments.ArgumentException ae) { printTitle(); System.out.println(); System.out.println(ae.getMessage()); System.out.println(); printUsage(arguments); System.exit(1); } if (arguments.hasOption("help")) { printTitle(); printUsage(arguments); System.exit(0); } if (arguments.hasOption("version")) { printTitle(); } advanced = arguments.hasOption("advanced"); String[] args2 = arguments.getLeftoverArguments(); if (args2.length > 1) { System.err.println("Unknown option: " + args2[1]); System.err.println(); printUsage(arguments); return; } // if (args2.length > 1) { // // if (args.length != 3) { // printTitle(); // printUsage(arguments); // System.exit(1); // } // // String inputFileName = args[0]; // String templateFileName = args[1]; // String outputFileName = args[2]; // // new CommandLineBeauti(inputFileName, templateFileName, outputFileName); // // } else { String inputFileName = null; if (args2.length == 1) { inputFileName = args2[0]; } if (OSType.isMac()) { System.setProperty("apple.awt.graphics.UseQuartz", "true"); System.setProperty("apple.awt.antialiasing","true"); System.setProperty("apple.awt.rendering","VALUE_RENDER_QUALITY"); System.setProperty("apple.laf.useScreenMenuBar","true"); System.setProperty("apple.awt.draggableWindowBackground","true"); System.setProperty("apple.awt.showGrowBox","true"); try { // set the Quaqua Look and Feel in the UIManager javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { try { try { // We need to do this using dynamic class loading to avoid other platforms // having to link to this class. If the Quaqua library is not on the classpath // it simply won't be used. Class<?> qm = Class.forName("ch.randelshofer.quaqua.QuaquaManager"); Method method = qm.getMethod("setExcludedUIs", Set.class); Set<String> excludes = new HashSet<String>(); excludes.add("Button"); excludes.add("ToolBar"); method.invoke(null, excludes); } catch (Throwable e) { } //set the Quaqua Look and Feel in the UIManager UIManager.setLookAndFeel( "ch.randelshofer.quaqua.QuaquaLookAndFeel" ); lafLoaded = true; } catch (Exception e) { } } }); } catch (Exception e) { } UIManager.put("SystemFont", new Font("Lucida Grande", Font.PLAIN, 13)); UIManager.put("SmallSystemFont", new Font("Lucida Grande", Font.PLAIN, 11)); } try { if (!lafLoaded) { try { // set the System Look and Feel in the UIManager javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } } }); } catch (Exception e) { e.printStackTrace(); } } java.net.URL url = BeautiApp.class.getResource("images/beauti.png"); Icon icon = null; if (url != null) { icon = new ImageIcon(url); } final String nameString = "BEAUti"; final String versionString = version.getVersionString(); String aboutString = "<html>" + "<div style=\"font-family:HelveticaNeue-Light, 'Helvetica Neue Light', Helvetica, Arial, 'Lucida Grande',sans-serif; font-weight: 100\">" + "<center>" + "<div style=\"font-size:13\"><p>Bayesian Evolutionary Analysis Utility<br>" + "Version " + versionString + ", " + version.getDateString() + "</p>" + "<p>by Alexei J. Drummond, Andrew Rambaut, Marc A. Suchard and Walter Xie</p></div>" + "<hr><div style=\"font-size:11;\">Part of the BEAST package:" + version.getHTMLCredits() + "</div></center></div></html>"; String websiteURLString = "http://beast.bio.ed.ac.uk/BEAUti"; String helpURLString = "http://beast.bio.ed.ac.uk/BEAUti"; System.setProperty("BEAST & BEAUTi Version", version.getVersion()); BeautiApp app = new BeautiApp(nameString, aboutString, icon, websiteURLString, helpURLString); app.setDocumentFrameFactory(new DocumentFrameFactory() { public DocumentFrame createDocumentFrame(Application app, MenuBarFactory menuBarFactory) { return new BeautiFrame(nameString); } }); app.initialize(); if (inputFileName != null) { app.doOpen(inputFileName); } else { app.doNew(); } } catch (Exception e) { JOptionPane.showMessageDialog(new JFrame(), "Fatal exception: " + e, "Please report this to the authors", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } // } } public static boolean advanced = false; }