package beast.app.util; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.GraphicsEnvironment; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.Window; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JOptionPane; import beast.core.util.Log; import beast.util.AddOnManager; /** Utils that work with Java6 **/ public class Utils6 { public static class Canvas extends JComponent { private static final long serialVersionUID = 1L; Image imageBuffer; public Canvas() { } @Override public void paintComponent( Graphics g ) { // copy buffered image if ( imageBuffer != null ) g.drawImage(imageBuffer, 0,0, this); } /** Get a buffered (persistent) image for drawing on this component */ public Graphics getBufferedGraphics() { Dimension dim = getSize(); imageBuffer = createImage( dim.width, dim.height ); return imageBuffer.getGraphics(); } @Override public void setBounds( int x, int y, int width, int height ) { setPreferredSize( new Dimension(width, height) ); setMinimumSize( new Dimension(width, height) ); super.setBounds( x, y, width, height ); } } //Splash static Window splashScreen; static Canvas can; /* This could live in the desktop script. However we'd like to get it on the screen as quickly as possible. */ public static void startSplashScreen() { Image img = getIcon("beast/app/draw/icons/beauti.png").getImage(); int width=2 * img.getWidth(null), height=img.getHeight(null); Window win=new Window( new Frame() ); win.pack(); can = new Canvas(); can.setSize( width, height ); // why is this necessary? Toolkit tk=Toolkit.getDefaultToolkit(); Dimension dim=tk.getScreenSize(); win.setBounds( dim.width/2-width/2, dim.height/2-height/2, width, height ); win.add("Center", can); // Image img=tk.getImage( // Utils.class.getResource("beast.png") ); //what MediaTracker mt=new MediaTracker(can); mt.addImage(img,0); try { mt.waitForAll(); } catch ( Exception e ) { } Graphics gr=can.getBufferedGraphics(); gr.drawImage(img, width / 4, 0, can); win.setVisible(true); win.toFront(); splashScreen = win; } public static void endSplashScreen() { if ( splashScreen != null ) { splashScreen.dispose(); can = null; splashScreen = null; } } public static ImageIcon getIcon(String iconLocation) { try { URL url = ClassLoader.getSystemResource(iconLocation); if (url == null) { Log.warning.println("Cannot find icon " + iconLocation); return null; } ImageIcon icon = new ImageIcon(url); return icon; } catch (Exception e) { Log.warning.println("Cannot load icon " + iconLocation + " " + e.getMessage()); return null; } } public static boolean testCudaStatusOnMac() { String cudaStatusOnMac = "<html>It appears you have CUDA installed, but your computer hardware does not support it.<br>" + "You need to remove CUDA before BEAST/BEAUti can start.<br>" + "To remove CUDA, delete the following folders by typing in a terminal:<br>" + "rm -r /Library/Frameworks/CUDA.framework<br>" + "rm -r /Developer/NVIDIA<br>" + "rm -r /usr/local/cuda<br>" + "You may need 'sudo rm' instead of 'rm'</html>"; boolean forceJava = Boolean.valueOf(System.getProperty("java.only")); if (forceJava) { // don't need to check if Beagle (and thus CUDA) is never loaded return true; } if (isMac()) { // check any of these directories exist // /Library/Frameworks/CUDA.framework // /Developer/NVIDIA // /usr/local/cuda // there is evidence of CUDA being installed on this computer // try to create a BeagleTreeLikelihood using a separate process try { if (new File("/Library/Frameworks/CUDA.framework").exists() || new File("/Developer/NVIDIA").exists() || new File("/usr/local/cuda").exists()) { String java = System.getenv("java.home"); if (java == null) { java ="/usr/bin/java"; } else { java += "/bin/java"; } String beastJar = AddOnManager.getPackageUserDir(); beastJar += "/" + "BEAST" + "/" + "lib" + "/" + "beast.jar"; if (!new File(beastJar).exists()) { Log.debug.println("Could not find beast.jar, giving up testCudaStatusOnMac"); return true; } //beastJar = "\"" + beastJar + "\""; //beastJar = "/Users/remco/workspace/beast2/build/dist/beast.jar"; Process p = Runtime.getRuntime().exec(new String[]{java , "-cp" , beastJar , "beast.app.util.Utils"}); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = input.readLine()) != null) { Log.debug.println(line); } input.close(); if (p.exitValue() != 0) { if (GraphicsEnvironment.isHeadless()) { cudaStatusOnMac = cudaStatusOnMac.replaceAll("<br>", "\n"); cudaStatusOnMac = cudaStatusOnMac.replaceAll("<.?html>","\n"); Log.warning.println("WARNING: " + cudaStatusOnMac); } else { JOptionPane.showMessageDialog(null, cudaStatusOnMac); } return false; } } } catch (Exception err) { err.printStackTrace(); } } return true; } public static boolean isMac() { return System.getProperty("os.name").toLowerCase().startsWith("mac"); } public static boolean isWindows() { return System.getProperty("os.name").toLowerCase().startsWith("windows"); } public static boolean isLinux() { return System.getProperty("os.name").toLowerCase().startsWith("linux"); } }