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");
}
}
}