/*
* InstantiableTracerApp.java
*
* Copyright (C) 2002-2012 Alexei Drummond and Andrew Rambaut
*
* 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.tracer.application;
import dr.app.util.OSType;
import dr.inference.trace.LogFileTraces;
import jam.framework.DocumentFrame;
import jam.framework.SingleDocApplication;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.security.Permission;
import java.util.Locale;
/**
*
* A class for calling an instance of Tracer within a BEAST (or any other Java) analysis.
* Allows a threaded call of Tracer (that won't terminate the JVM). A lot of the code is
* copied from TracerApp.java (but is a SingleDocApplication instead of a
* MultiDocApplication)
*
*
* @author Wai Lok Sibon Li
* @version $Id: InstantiableTracerApp.java,v 1.0 2012/09/17 15:23:33 sibon.li Exp $
*/
public class InstantiableTracerApp extends SingleDocApplication {
private boolean exiting;
public InstantiableTracerApp (String nameString, String aboutString, Icon icon,
String websiteURLString, String helpURLString, boolean exiting) {
super(new TracerMenuBarFactory(), nameString, aboutString, icon,
websiteURLString, helpURLString);
addPreferencesSection(new GeneralPreferencesSection());
this.exiting = exiting;
}
@Override
public void doQuit() {
if(exiting) { // Implemented this way because documentFrame is private in SingleDocApplication
super.doQuit();
}
else {
if (documentFrame == null) {
return;
}
if (documentFrame.requestClose()) {
documentFrame.setVisible(false);
documentFrame.dispose();
// try {
// System.exit(0);
// }catch (ExitException e) {
// System.setSecurityManager(null);
// }
}
}
}
// @Override
// public void doQuit() {
// //super.doQuit();
// if (documentFrame == null) {
// return;
// }
// if (documentFrame.requestClose()) {
//
// documentFrame.setVisible(false);
// documentFrame.dispose();
//// try {
//// System.exit(0);
//// }catch (ExitException e) {
//// System.setSecurityManager(null);
//// }
// }
// }
private DocumentFrame documentFrame = null;
private static void loadTracerInstance(String nameString, String logFileName, long bi, boolean exiting) {
final String name = nameString;
final String fileName = logFileName;
final long burnin = bi;
final boolean exit = exiting;
Thread thread = new Thread() {
public void run() {
try {
// 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);
boolean lafLoaded = false;
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");
// set the Quaqua Look and Feel in the UIManager
try {
UIManager.setLookAndFeel(
"ch.randelshofer.quaqua.QuaquaLookAndFeel"
);
lafLoaded = true;
} catch (Exception e) {
//
}
UIManager.put("SystemFont", new Font("Lucida Grande", Font.PLAIN, 13));
UIManager.put("SmallSystemFont", new Font("Lucida Grande", Font.PLAIN, 11));
}
if (!lafLoaded) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e1) {
e1.printStackTrace();
}
}
java.net.URL url = TracerApp.class.getResource("images/Mapper.png");
Icon icon = null;
if (url != null) {
icon = new ImageIcon(url);
}
InstantiableTracerApp app = new InstantiableTracerApp(name,
"Tracer tool running through "+ name + ". Authors Wai Lok Sibon Li & Andrew Rambaut",
icon, "http://beast.bio.ed.ac.uk/", "http://beast.bio.ed.ac.uk/Tracer", exit);
TracerFrame frame = new TracerFrame(name);
app.setDocumentFrame(frame);
app.initialize();
File file = new File(fileName);
LogFileTraces[] traces = { new LogFileTraces(fileName, file) };
traces[0].setBurnIn((int) burnin);
frame.processTraces(traces);
}
catch(Exception e) {
e.printStackTrace();
throw new RuntimeException("Exception in InstantiableTracerApp");
}
}
};
// System.setSecurityManager(new NoExitSecurityManager());
thread.start();
}
/*
*Instantiates a Tracer window which will terminate the JRE (similar to Tracer but burnin can be set)
*/
public static void loadExitingTracerInstance(String nameString, String logFileName, long bi) {
loadTracerInstance(nameString, logFileName, bi, true);
}
/*
* Loads an instance of tracer that does not terminate the JRE. Also does not call System.exit() when the
* window is closed by the user.
*/
public static void loadNonExitingTracerInstance(String nameString, String logFileName, long bi) {
loadTracerInstance(nameString, logFileName, bi, false);
}
}
@Deprecated
class NoExitSecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm) {
// super.checkPermission(perm);
}
@Override
public void checkPermission(Permission perm, Object context) {
// super.checkPermission(perm, context);
}
@Override
public void checkExit(int status) {
super.checkExit(status);
throw new ExitException(status);//ExitException(status);
}
}
@Deprecated
class ExitException extends SecurityException {
public final int status;
public ExitException(int status) {
super();
this.status = status;
}
}