package com.drawbridge; import java.awt.Font; import java.awt.FontFormatException; import java.awt.GraphicsEnvironment; import java.awt.Image; import java.awt.Toolkit; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import com.drawbridge.utils.Utils; public class Main { public static Font mainFont = null; static { loadLibrary(); loadFonts(); } private static void loadLibrary() { final String osName = System.getProperty("os.name"); final int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model")); try { InputStream in = null; File fileOut = null; Utils.out.println(Main.class, osName); if (osName.startsWith("Windows")) { if (bitness == 32) { Utils.out.println(Main.class, "32 bit detected"); in = Main.class.getResourceAsStream("/opencv_java245_x86.dll"); if(in == null) throw new FileNotFoundException("Could not find either x86 or x64 libs!"); Utils.out.println(Main.class, "Found OpenCV Library"); } else if (bitness == 64) { Utils.out.println(Main.class, "64 bit detected"); in = Main.class.getResourceAsStream("/opencv_java245_x64.dll"); if(in == null){ in = Main.class.getResourceAsStream("/opencv_java245_x86.dll"); if(in == null){ throw new FileNotFoundException("Could not find either x86 or x64 libs!"); } } Utils.out.println(Main.class, "Found OpenCV Library"); } else Utils.out.println(Main.class, "Unknown bit detected - trying with 32 bit"); fileOut = File.createTempFile("lib", ".dll"); } else if (osName.equals("Mac OS X")) { in = Main.class.getResourceAsStream("/libopencv_java248_mac64.dylib"); if (in == null) { Utils.err.println(Main.class, ("Could not find OpenCV Library")); } else { Utils.out.println(Main.class, "Found OpenCV Library"); } fileOut = File.createTempFile("lib", ".dylib"); System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty("com.apple.mrj.application.apple.menu.about.name", "DrawBridge"); } else{ throw new Exception("Unknown Operating System!"); } OutputStream out = FileUtils.openOutputStream(fileOut); IOUtils.copy(in, out); in.close(); out.close(); System.load(fileOut.toString()); } catch (Exception | UnsatisfiedLinkError e) { e.printStackTrace(); FutureTask<Integer> dialogTask = new FutureTask<Integer>(new Callable<Integer>(){ @Override public Integer call() { return JOptionPane.showOptionDialog(null, "Failed to load OpenCV Library for " + osName + " on " + bitness + "bit JVM", "OpenCV Error", 0, JOptionPane.ERROR_MESSAGE, null, new String[] { "Close", "Load Library" }, "test"); } }); SwingUtilities.invokeLater(dialogTask); int result; try { result = dialogTask.get(); switch (result) { case 0: System.exit(0); break; case 1: Utils.out.println("attemptToLoadLibrary"); Main.attemptToLoadLibrary(); break; case JOptionPane.CLOSED_OPTION: System.exit(0); break; } } catch (InterruptedException e1) { e1.printStackTrace(); } catch (ExecutionException e1) { e1.printStackTrace(); } } finally{ Utils.out.println(Main.class, "OpenCV Library loaded successfully"); Utils.out.println(Main.class, "JavaFX Version:" + com.sun.javafx.runtime.VersionInfo.getRuntimeVersion()); } } public static void attemptToLoadLibrary() { Utils.out.println("Attempt to load library method"); // Get file name FutureTask<File> dialogTask = new FutureTask<File>(new Callable<File>(){ JFileChooser jfc; @Override public File call() { jfc = new JFileChooser(); int result = jfc.showOpenDialog(null); switch(result){ case JFileChooser.APPROVE_OPTION: return jfc.getSelectedFile(); case JFileChooser.CANCEL_OPTION: System.exit(0); return null; case JFileChooser.ERROR_OPTION: System.exit(0); return null; } return null; } }); SwingUtilities.invokeLater(dialogTask); File file = null; try { file = dialogTask.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } // Try to load file InputStream in = null; File fileOut = null; Utils.out.println(Main.class, "Unknown bit detected - trying with 32 bit"); try { in = new FileInputStream(file.getAbsolutePath()); fileOut = File.createTempFile("lib", ".dll"); OutputStream out = FileUtils.openOutputStream(fileOut); IOUtils.copy(in, out); in.close(); out.close(); System.load(fileOut.toString()); } catch (Exception | UnsatisfiedLinkError e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "Failed to load Library " + file.getName()); System.exit(0); } } private static void loadFonts() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("Assets/Fonts/Inconsolata-g.ttf"); try { Font customFont = Font.createFont(Font.TRUETYPE_FONT, is); mainFont = customFont.deriveFont(16.0f).deriveFont(Font.BOLD); is.close(); ge.registerFont(mainFont); } catch (FontFormatException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } public static void main(String[] args) { System.setProperty("swing.aatext", "true"); Activity mainMenuWindow = Activity.getInstance(); mainMenuWindow.setVisible(true); // ParsonsTest syntaxTest = ParsonsTest.getInstance(); // syntaxTest.setVisible(true); String osName = System.getProperty("os.name"); if (osName.equals("Mac OS X")) { Toolkit toolkit = Toolkit.getDefaultToolkit(); Image img = toolkit.getImage("icon.png"); setDockIconImage(img); } } private static void setDockIconImage(Image img) { try { final Class<?> applicationClass = Class.forName("com.apple.eawt.Application"); final Method getApplicationMethod = applicationClass.getMethod("getApplication"); final Method setDockIconImageMethod = applicationClass.getMethod("setDockIconImage", Image.class); final Object applicationObject = getApplicationMethod.invoke(null); setDockIconImageMethod.invoke(applicationObject, img); } catch (Exception e) { Utils.out.println(Main.class, "Exception invoking setDockIconImage"); } } }