package aliview;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.lang.reflect.Method;
import java.net.JarURLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import javax.swing.Icon;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.ToolTipManager;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.Border;
import javax.swing.plaf.FontUIResource;
import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.simplericity.macify.eawt.Application;
import org.simplericity.macify.eawt.ApplicationEvent;
import org.simplericity.macify.eawt.ApplicationListener;
import org.simplericity.macify.eawt.DefaultApplication;
import utils.DialogUtils;
import utils.FileUtilities;
import utils.MacAdapter;
import utils.OSNativeUtils;
import aliview.gui.AliViewJMenuBarFactory;
import aliview.gui.RepeatingKeyEventsFixer;
import aliview.messenges.Messenger;
import aliview.settings.Settings;
import aliview.test.Test;
public class AliView implements ApplicationListener{
private static final String LF = System.getProperty("line.separator");
private static final AliViewJMenuBarFactory menuBarFactory = new AliViewJMenuBarFactory();
private static AliView aliView;
private static ArrayList<AliViewWindow> aliViewWindows = new ArrayList<AliViewWindow>();
private static AliViewWindow activeWindow = null;
private static final Logger logger = Logger.getLogger(AliView.class);
private static File savedInitialArgumentAlignmentFileForMac = null;
private static boolean debugMode = false;
/**
* Launch the application.
*/
public static void main(String[] args){
// First set max logging for startup, then at end of initialization turn off
// // it can then be turned on manually from menu
// System.setErr( new PrintStream( new LoggingOutputStream( logger, Level.ERROR ), true));
// System.setOut( new PrintStream( new LoggingOutputStream( logger, Level.INFO ), true));
long startTime = System.currentTimeMillis();
Logger.getRootLogger().setLevel(Level.ALL);
logAllLogs();
logger.info("version " + AliView.getVersion());
long time = AliView.getTime(AliView.class);
logger.info("version time " + new Date(time));
System.out.println("Time to here in ms = " + ( System.currentTimeMillis() - startTime));
// list all properties
Properties props = System.getProperties();
Enumeration keys = props.keys();
while (keys.hasMoreElements()) {
String key = (String)keys.nextElement();
String value = (String)props.get(key);
logger.debug(key + "=" + value);
}
try{
// check for debug args
boolean hasDebugArg = false;
if(args != null && args.length >= 1){
for(String arg: args){
if("debug".equalsIgnoreCase(arg)){
hasDebugArg = true;
}
}
}
// check if debug in user environ
String debugEnv = System.getenv("ALIVIEW_DEBUG");
logger.info("debugEnv" + debugEnv);
debugEnv = null;
// Set exception handler that takes care of error that are uncaught in the GUI-thread (Event-dispatching-queue)
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace();
if(e instanceof OutOfMemoryError){
Messenger.showOKOnlyMessage(Messenger.OUT_OF_MEMORY_ERROR, activeWindow);
}
}
});
RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
List<String> aList = bean.getInputArguments();
for (int i = 0; i < aList.size(); i++) {
logger.info("" + aList.get( i ));
}
// print the non-JVM command line arguments using args
// name of the main class
logger.info(" " + System.getProperty("sun.java.command"));
logger.info("java.vendor" + System.getProperty("java.vendor"));
logger.info("java.version" + System.getProperty("java.version"));
// Log program args
if(args != null){
logger.info("args.length=" + args.length);
for(String arg: args){
logger.info("arg=" + arg);
}
}
else{
logger.info("args(null)=" + args);
}
// set debug mode
if(hasDebugArg || (debugEnv != null)){
AliView.setDebug(true);
}
else{
AliView.setDebug(false);
}
// I think this issue is solved now when creating actions and adding keybinding to the root pane
// if(OSNativeUtils.isLinuxOrUnix()){
// RepeatingKeyEventsFixer rf = new RepeatingKeyEventsFixer();
// rf.install();
// }
// Quick tooltips and for a long time
ToolTipManager.sharedInstance().setInitialDelay(100);
ToolTipManager.sharedInstance().setDismissDelay(3000);
// -Dsun.java2d.opengl=true
//System.setProperty("sun.java2d.opengl","True");
if(OSNativeUtils.isMac()){
//System.setProperty("awt.useSystemAAFontSettings","on");
//System.setProperty("swing.aatext", "true");
// Default look and feel mac is already Aqua
// This might actually be to late for setting mac-application menu
System.setProperty("apple.laf.useScreenMenuBar", "true");
// Mac application menu
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "AliView");
logger.info("apple.awt.antialiasing" + System.getProperty("apple.awt.antialiasing"));
logger.info("apple.awt.graphics.UseQuartz" + System.getProperty("apple.awt.graphics.UseQuartz"));
logger.info("apple.awt.graphics.EnableQ2DX" + System.getProperty("apple.awt.graphics.EnableQ2DX"));
logger.info("apple.awt.rendering" + System.getProperty("apple.awt.rendering"));
// ToDo turn on anti-aliasing on Mac
// System.setProperty("apple.awt.antialiasing","on");
// System.setProperty("apple.awt.rendering", "VALUE_RENDER_SPEED");
//System.setProperty("apple.awt.graphics.UseQuartz", "false");
//System.setProperty("apple.awt.graphics.EnableQ2DX", "true");
logger.info("apple.awt.antialiasing" + System.getProperty("apple.awt.antialiasing"));
logger.info("apple.awt.graphics.UseQuartz" + System.getProperty("apple.awt.graphics.UseQuartz"));
logger.info("apple.awt.graphics.EnableQ2DX" + System.getProperty("apple.awt.graphics.EnableQ2DX"));
logger.info("apple.awt.rendering" + System.getProperty("apple.awt.rendering"));
}
else if(OSNativeUtils.isLinuxOrUnix()){
try {
// First try Nimbus
boolean uiFound = false;
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
// First try Nimbus
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
uiFound = true;
break;
}
}
if(! uiFound){
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("com.sun.java.swing.plaf.gtk.GTKLookAndFeel".equals(info.getClassName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
OSNativeUtils.installGtkPopupBugWorkaround();
uiFound = true;
break;
}
}
}
if(! uiFound){
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
uiFound = true;
}
} catch (Exception e) {
e.printStackTrace();
}
}
else{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
}
// debugUIDefaults();
if(Settings.getUseCustomFontSize().getBooleanValue()){
logger.info("user font size");
float userSize = Settings.getCustomFontSize().getIntValue();
Object obj = UIManager.getLookAndFeelDefaults().get("defaultFont");
if(obj != null && obj instanceof Font){
Font defaultFont = (Font) obj;
UIManager.getLookAndFeelDefaults().put("defaultFont", defaultFont.deriveFont(userSize));
}
// and some more keys
setUIFontSize(userSize);
}
// On other system than windows (mac and linux) use smaller default font label size
if(!Settings.getUseCustomFontSize().getBooleanValue()){
if(! OSNativeUtils.isWindows()){
Object fontObj = UIManager.getLookAndFeelDefaults().get("Label.font");
if(fontObj != null && fontObj instanceof Font){
Font defaultFont = (Font) fontObj;
UIManager.getLookAndFeelDefaults().put("Label.font", defaultFont.deriveFont(12f));
}
}
}
aliView = new AliView();
// get alignment fileName as first argument to program
File alignmentFile = null;
if(args != null && args.length >= 1){
alignmentFile = new File(args[0]);
}
// if alignmentfile is invalid set it to null
if(alignmentFile != null && alignmentFile.exists() == false){
alignmentFile = null;
}
if(AliView.isDebugMode() && alignmentFile == null){
// alignmentFile = new File("/home/anders/projekt/ormbunkar/analys/sekv_analysis/aligned-WoodsiatrnGR-mafft.fasta.nexus");
//File alignmentFile = new File("/home/anders/projekt/ormbunkar/analys/test_seqconcat/test_seqconcat.nexus");
//File alignmentFile = new File("/home/anders/projekt/ormbunkar/cytotree/sequences/rbcl_all_ferns.tiny.xml.fasta");
//alignmentFile = new File("/home/anders/projekt/sequences/anjas_cpDNA_con09123cut.selection_high.fasta");
//File alignmentFile = new File("/home/anders/projekt/ormbunkar/fernloci/carl_genbank_submit/tplate_r2_fixed.nex");
//File alignmentFile = new File("/home/anders/projekt/alignments/carl_protein_test/loci/concat.nexus.reopened.");
//File alignmentFile = new File("/home/anders/projekt/ormbunkar/analys/seqconcat_test/seqconcat_test.nexus");
//File alignmentFile = new File("/home/anders/projekt/virusfylogeni/JennyHesson/20131010_ed_virus.nexus");
//File alignmentFile = new File("/home/anders/projekt/virusfylogeni/JennyHesson/analys/mb/20130308_virus.nexus");
//alignmentFile = new File("/home/anders/projekt/ormbunkar/sekvenser_output/forkade_alignments/Woodsia_chloroplast_min1_20131101_v2.nexus");
//alignmentFile = new File("/home/anders/projekt/ormbunkar/analys/sekv_analysis/aligned-WoodsiapgiC-mafft.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/carl_protein_test/concat.nexus.phy.translated.phy");
//alignmentFile = new File("/home/anders/projekt/alignments/sample_of_SSURef_108_full_align_tax_silva_trunc_larger.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/WoodsiapgiC-forked_2.nexus");
// alignmentFile = new File("/home/anders/projekt/alignments/SMALL-FLAVI-v7-dating.nuc.aed.ALL.protfnuc.mafft.glob.cod.seav.fasta");
//alignmentFile = new File("/home/anders/projekt/ormbunkar/fernloci/alignments_work/refined/6928/6928_all_w_arabid.27.fasta");
//alignmentFile = new File("/home/anders/projekt/ormbunkar/analys/forked_pgiC_indel/WoodsiapgiC-forked_1_indels.only_seqs.nexus");
// alignmentFile = new File("/home/anders/projekt/alignments/ssu_pr2-99.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/sample_of_SSURef_108_full_align_tax_silva_trunc_larger.fasta");
// alignmentFile = new File("/vol2/big_data/SSURef_108_filtered_bacteria_pos_5389-24317.fasta");
//alignmentFile = new File("/vol2/big_data/test.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/sandies/euArc36C_F1_big_problematic.nex");
// alignmentFile = new File("/home/anders/projekt/alignments/sandies/euArc165F_F1.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/Woodsia_chloroplast_min4_20131109_v2.excluded.nexus");
//alignmentFile = new File("/home/anders/projekt/alignments/Woodsia_chloroplast_min1_20131029.nexus");
//alignmentFile = new File("/home/anders/projekt/alignments/sandies/Grp4+_GBank+208_trim3.phy");
alignmentFile = new File("/home/anders/projekt/alignments/Woodsia_chloroplast_min1_20131029.nexus");
//alignmentFile = new File("/home/anders/projekt/alignments/john/HEV_more.than.1400bp.sequence.MafftE_trim.no.gapseq.CUT.6260_7490.nexus");
// alignmentFile = new File("/vol2/big_data/test.nexus");
// alignmentFile = new File("/vol2/johns_454/SSURef_108_full_align_tax_silva_trunc.fasta");
// alignmentFile = new File("/vol2/big_data/SSURef_108_full_align_tax_silva_trunc.selection.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/sample_of_SSURef_108_full_align_tax_silva_trunc.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/Silva_108_core_aligned_seqs.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/woodsia_chloropl_excl_hybrid.selection.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/harris_CT144.phy");
// alignmentFile = new File("/home/anders/projekt/alignments/harris_CT144_seq_v2.phy");
// alignmentFile = new File("/home/anders/projekt/alignments/harris_CT144_seq_v2_shortname_sequential.phy");
// alignmentFile = new File("/vol2/big_data/small_test_shortname.phy");
// alignmentFile = new File("/vol2/big_data/test.phy");
// alignmentFile = new File("/vol2/big_data/test.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/smalphylipSeqShortName.phy");
// alignmentFile = new File("/home/anders/projekt/alignments/smalphylipInterlLongName.phy");
//alignmentFile = new File("/home/anders/projekt/alignments/smalphylipInterlShortName.phy");
// alignmentFile = new File("/home/anders/projekt/alignments/harris_CT144.phy");
//alignmentFile = new File("/home/anders/projekt/alignments/gold_strains_gg16S_aligned.fasta");
// alignmentFile = new File("/home/anders/projekt/alignments/woodsia_chloropl_excl_hybrid.fasta");
// alignmentFile = new File("/home/anders/projekt/henriks_laboul/both.fasta");
// alignmentFile = new File("/home/anders/projekt/ormbunkar/sekvenser_output/forkade_alignments/WoodsiapgiC-forked_2.nexus");
// alignmentFile = new File("/home/anders/projekt/ormbunkar/sekvenser_output/forkade_alignments/Woodsia_chloroplast_min1_20131101_v2.nexus.excluded");
// alignmentFile = new File("/home/anders/projekt/ormbunkar/analys/test_protein_alignment.fasta");
//alignmentFile = new File("/home/anders/projekt/ormbunkar/analys/phylip.example.phy");
//alignmentFile = new File("/home/anders/projekt/ormbunkar/analys/pgiC_20121215/pgiC_20121215.phylip");
//alignmentFile = new File("/home/anders/tmp/Purple_ITScut2.nexus");
//alignmentFile = new File("/home/anders/projekt/ormbunkar/fernloci/carls_example/locus_alignments_transcriptome/4321_transcriptome_alignments_etc/4321_v2.2_allin.nex");
//alignmentFile = new File("/opt/Silva_108/core_aligned/Silva_108_core_aligned_seqs.fasta");
//alignmentFile = new File("/home/anders/projekt/alignments/MSF_format.example.msf");
//alignmentFile = new File("/home/anders/projekt/alignments/clustal_wrong2.aln");
// alignmentFile = new File("/home/anders/projekt/alignments/Woodsia_chloroplast_min4_20131109_v2.excluded.msf");
// alignmentFile = new File("/home/anders/projekt/alignments/infile_V2.phy");
// alignmentFile = new File("/home/anders/projekt/alignments/smalphylipInterlLongName.phy");
if(! alignmentFile.exists()){
alignmentFile = null;
}
}
logger.info("6");
// only open file in Mac if there is a file name argument
// - otherwise open is handeled in handleOpenFile()
// but if --args is passed on command line in mac - this is were to pick them up
// if(OSNativeUtils.isMac() && alignmentFile != null){
// logger.info("6.1");
// savedInitialArgumentAlignmentFileForMac = alignmentFile;
// // application AliView.createNewAliViewWindow will be called automatic in MacOS
// // via method handle open application
// logger.info("6.2");
// }
// for all non mac systems start here
if(! OSNativeUtils.isMac()){
AliView.createNewAliViewWindow(alignmentFile);
// Nowadays mac is started same way
}else if(OSNativeUtils.isMac()){
AliView.createNewAliViewWindow(alignmentFile);
}
// Create Application Adapter (only needed for OsX and register this AliView as listener of Application events (interface below)
if(OSNativeUtils.isMac()){
// first try latest version
boolean regAdapterOK = OSNativeUtils.registerMacAdapter(aliView);
logger.info("boolean regAdapterOK =" + regAdapterOK);
// if not try old version
if(!regAdapterOK){
logger.info("doing old version of Mac eawt");
Application macApplication = new DefaultApplication();
macApplication.addApplicationListener(aliView);
macApplication.addPreferencesMenuItem();
macApplication.setEnabledPreferencesMenu(true);
}
}
}catch(Exception ex){
ex.printStackTrace();
}catch(Error err){
logger.info("error was caught");
err.printStackTrace();
}
// set debug mode
if(isDebugMode()){
Logger.getRootLogger().setLevel(Level.ALL);
}
else{
Logger.getRootLogger().setLevel(Level.ERROR);
}
//Logger.getRootLogger().setLevel(Level.ERROR);
logger.info("done with main method");
}
private static void debugUIDefaults(){
UIDefaults def = UIManager.getLookAndFeelDefaults();
Enumeration enumer = def.keys();
while (enumer.hasMoreElements()) {
Object item = enumer.nextElement();
System.out.println(item +" " + def.get(item));
}
}
private static void setDebug(boolean b) {
debugMode = b;
}
public static boolean isDebugMode() {
return debugMode;
}
/**
* Create the application.
*/
public AliView() {
}
public static void openAlignmentFileViaChooser(Component parent) {
// As default get last used stored directory
String suggestedDir = Settings.getLoadAlignmentDirectory();
File suggestedFile = new File(suggestedDir);
File selectedFile = FileUtilities.selectOpenFileViaChooser(suggestedFile,parent);
if(selectedFile != null){
openAlignmentFile(selectedFile);
Settings.putLoadAlignmentDirectory(selectedFile.getParent());
}
}
private static boolean souldBreakBecauseOfLowMemory(File alignmentFile){
double fileSize = alignmentFile.length();
double fileSizeMB = fileSize / (1000 * 1000);
double presumableFreeMemory = MemoryUtils.getPresumableFreeMemoryMB();
MemoryUtils.logMem();
logger.info("getPresumableFreeMemory()=" + MemoryUtils.getPresumableFreeMemoryMB());
logger.info("fileSizeMB=" + fileSizeMB);
boolean isBreakBecauseOfLowMemory = false;
if(presumableFreeMemory < 1.5 * fileSizeMB){
// ask user whether to continue or not
String message="Memory is running low, if you open this Alignment before closing some" + LF +
"other Alignments the program might run out of Memory." + LF +
"" + LF +
"Do you want to continue and open the new Alignment?";
int retVal = JOptionPane.showConfirmDialog(DialogUtils.getDialogParent(), message, "Continue?", JOptionPane.YES_NO_CANCEL_OPTION);
// return if not OK
if(retVal != JOptionPane.OK_OPTION){
isBreakBecauseOfLowMemory = true;
}
}
return isBreakBecauseOfLowMemory;
}
public static void openAlignmentFile(File alignmentFile){
try{
// if it is empty load file in old window - otherwise create new window
logger.info("activeWindow=" + activeWindow);
if(hasNonEmptyWindows()){
if(souldBreakBecauseOfLowMemory(alignmentFile)){
return;
}
}
if(activeWindow != null && activeWindow.isEmpty()){
activeWindow.loadNewAlignmentFile(alignmentFile);
}else{
createNewAliViewWindow(alignmentFile);
}
Settings.putLoadAlignmentDirectory(alignmentFile.getAbsoluteFile().getParent());
Settings.addRecentFile(alignmentFile);
} catch (Exception e) {
e.printStackTrace();
}catch(OutOfMemoryError memoryErr){
logger.info("memory err");
memoryErr.printStackTrace();
Messenger.showOKOnlyMessage(Messenger.OUT_OF_MEMORY_ERROR, activeWindow);
}catch(Error err){
err.printStackTrace();
}
}
private static boolean hasNonEmptyWindows() {
boolean hasNonEmptyWin = false;
for(AliViewWindow aliWin: aliViewWindows){
if(aliWin != null && !aliWin.isEmpty()){
hasNonEmptyWin = true;
}
}
return hasNonEmptyWin;
}
public static void createNewWindow() {
logger.info("new win");
createNewAliViewWindow(null);
}
public static AliViewWindow getActiveWindow(){
return activeWindow;
}
private static void createNewAliViewWindow(final File alignmentFile){
try {
AliViewWindow newWin = new AliViewWindow(alignmentFile,menuBarFactory);
newWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
newWin.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
// create and add windowlisteners
newWin.addWindowListener(new WindowAdapter() {
public void windowActivated(java.awt.event.WindowEvent e) {
AliViewWindow thisWin = (AliViewWindow) e.getWindow();
activeWindow = thisWin;
logger.info("window activated");
}
public void windowClosing(WindowEvent e) {
AliViewWindow thisWin = (AliViewWindow) e.getWindow();
AliView.closeWindow(thisWin);
}
}); // end WindowAdapter
// if there is another active window save that geom first
if(activeWindow != null){
activeWindow.saveWindowGeometry();
}
aliViewWindows.add(newWin);
activeWindow = newWin;
newWin.restoreWindowGeometry();
// open window a little bit offset if there is one already
if(aliViewWindows.size()>1){
newWin.setLocation(newWin.getX() + 20, newWin.getY() + 10);
}
// adjust window so it is not outside desktop
placeWithinDesktop(newWin);
newWin.setVisible(true);
newWin.toFront();
}catch(Exception e) {
logger.error(e, e);
}catch(OutOfMemoryError memoryErr){
logger.error(memoryErr, memoryErr);
logger.info("memory err");
// memoryErr.printStackTrace();
Messenger.showOKOnlyMessage(Messenger.OUT_OF_MEMORY_ERROR, activeWindow);
}catch(Error err){
logger.error(err, err);
}
}
public static void closeWindow(AliViewWindow thisWin) {
boolean isCloseOK = thisWin.requestWindowClose();
if(isCloseOK){
thisWin.dispose();
aliViewWindows.remove(thisWin);
// if this was last then quit
if(aliViewWindows.size() == 0){
AliView.quitProgram();
}
}
else{
// do nothing
}
}
public static void setUIFontSize (float newSize){
Enumeration<Object> keys = UIManager.getLookAndFeelDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get (key);
if (value != null && value instanceof Font){
// logger.info(key + " " + value);
Font derivFont = ((Font)value).deriveFont(newSize);
FontUIResource fontRes = new FontUIResource(derivFont);
// logger.info(key + " " + fontRes);
UIManager.getLookAndFeelDefaults().put (key, fontRes);
}
}
}
private static void placeWithinDesktop(AliViewWindow newWin) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screen = new Rectangle(screenSize);
Rectangle intersection = screen.intersection(newWin.getBounds());
// make sure size is something
if(intersection.getWidth() < 100 || intersection.getHeight() < 100){
newWin.setBounds(0,0,200,200);
}else{
newWin.setBounds(intersection);
}
}
public static void quitProgram() {
// close all windows (ask if it is OK)
// reverse order since that is order you windows opened
for(int n = aliViewWindows.size() - 1; n >= 0; n--){
AliViewWindow window = aliViewWindows.get(n);
boolean isCloseOK = window.requestWindowClose();
if(isCloseOK){
window.dispose();
aliViewWindows.remove(window);
}
else{
// Not OK stop operation
return;
}
}
logger.info("System exit");
System.exit(0);
}
public static void logAllLogs(){
Enumeration enumer = Logger.getRootLogger().getAllAppenders();
while ( enumer.hasMoreElements() ){
Appender app = (Appender)enumer.nextElement();
if ( app instanceof FileAppender ){
System.out.println("File: " + ((FileAppender)app).getFile());
}
}
}
public static String getVersion() {
Properties versionProp = new Properties();
InputStream in = AliView.class.getResourceAsStream("/version.properties");
String version = "";
try {
versionProp.load(in);
version = (String)versionProp.get("version");
} catch (Exception exc) {
logger.error("error loading version config");
exc.printStackTrace();
version = "?";
}
return version;
}
public static long getTime(Class<?> cl) {
try {
String rn = cl.getName().replace('.', '/') + ".class";
JarURLConnection j = (JarURLConnection) ClassLoader.getSystemResource(rn).openConnection();
return j.getJarFile().getEntry("META-INF/MANIFEST.MF").getTime();
} catch (Exception e) {
return 0;
}
}
/*
*
* Mac OSX Application Listener (old versions of mac are using this) - Newer are Using MacAdapter
* - both are calling same method in the end
*
*/
public void handleAbout(ApplicationEvent event) {
// this is handled with a standard window in Mac - version is specified in application-jar
logger.info("inside handle About");
// TODO Auto-generated method stub
}
public void handleOpenApplication(ApplicationEvent event) {
/*
// Is called first time application start
logger.info("inside handle open application");
// check if file arguments this is if argument is passed to Mac on command line and not in Finder "open file with..." if
// open from finder or dropped, file name is passed with a call to handleOpenFile (or in the file dropped handler)
if(savedInitialArgumentAlignmentFileForMac != null){
AliView.createNewAliViewWindow(savedInitialArgumentAlignmentFileForMac);
}else{
AliView.createNewAliViewWindow(null);
}
*/
event.setHandled(true);
}
public void handleOpenFile(ApplicationEvent event) {
// TODO create new AliView if program
logger.info("inside handle open file" + event.getSource());
String fileName = event.getFilename();
logger.info("fileName" + fileName);
doMacOpenFile(new File(fileName));
event.setHandled(true);
}
public void handlePreferences(ApplicationEvent event) {
doMacPreferences();
}
public void handlePrintFile(ApplicationEvent event) {
// String message = "No print option - Instead choose Export as Image" + LF + "and then print from Image-program";
// JOptionPane.showConfirmDialog(activeWindow, message, "Print", JOptionPane.OK_OPTION);
doMacPrintFile();
}
public void handleQuit(ApplicationEvent event) {
logger.info("inside handle quit");
doMacQuit();
event.setHandled(true);
}
public void handleReOpenApplication(ApplicationEvent event) {
// Is handled when files are dropped
logger.info("inside handle RE-open application");
}
/*
*
* End Mac OSX Application Listener
*
*/
/*
*
* Common methods called by Mac ApplicationListener (the old eawt)
* and called by the new MacAdapter (the newer version eawt)
*
*/
public static void doMacPrintFile(){
AliView.activeWindow.printAlignment();
}
public static void doMacPreferences(){
AliView.activeWindow.openPreferencesGeneral();
}
public static void doMacOpenFile(File aFile){
AliView.openAlignmentFile(aFile);
}
public static void doMacQuit(){
AliView.quitProgram();
}
public static void focusNextWin() {
int activeWinIndex = 0;
for(int n = 0; n < aliViewWindows.size(); n++){
if(activeWindow == aliViewWindows.get(n)){
activeWinIndex = n;
}
}
int nextWin = activeWinIndex +1;
if(nextWin >= aliViewWindows.size()){
nextWin = 0;
}
aliViewWindows.get(nextWin).requestFocus();
}
}