/*
* ******************************************************************************
* * Copyright 2015 See AUTHORS file.
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
* *****************************************************************************
*/
package com.uwsoft.editor;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.dnd.DropTarget;
import java.awt.event.InputEvent;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.UIManager;
import com.uwsoft.editor.view.frame.FileDropListener;
import org.apache.commons.lang3.SystemUtils;
import com.badlogic.gdx.backends.jglfw.JglfwApplication;
import com.badlogic.gdx.backends.jglfw.JglfwApplicationConfiguration;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.backends.lwjgl.LwjglFrame;
import com.badlogic.gdx.tools.texturepacker.TexturePacker;
import com.uwsoft.editor.splash.SplashStarter;
import com.uwsoft.editor.utils.AppConfig;
public class Main {
private SplashStarter splash;
private LwjglFrame mainFrame;
public Main() {
splash = new SplashStarter(() -> startLoadingEditor());
}
private void startLoadingEditor() {
//first, kill off the splash
if (!(SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_UNIX)) {
splash.kill();
}
Overlap2D overlap2D = new Overlap2D();
Rectangle maximumWindowBounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
double width = maximumWindowBounds.getWidth();
double height = maximumWindowBounds.getHeight();
if (SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_MAC) {
System.setProperty("apple.laf.useScreenMenuBar", "true");
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "Overlap2D");
JglfwApplicationConfiguration config = new JglfwApplicationConfiguration();
config.width = (int) (width);
config.height = (int) (height - height * .04);
config.backgroundFPS = 0;
config.title = "Overlap2D - v" + AppConfig.getInstance().version;
new JglfwApplication(overlap2D, config);
} else {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.title = "Overlap2D - v" + AppConfig.getInstance().version;
config.fullscreen = true;
config.resizable = false;
config.width = (int) (width);
config.height = (int) (height - height * .04);
config.backgroundFPS = 0;
mainFrame = new LwjglFrame(overlap2D, config);
mainFrame.setExtendedState(mainFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
toggleVisible();
// subscribe to file dropping notifications, currently windows only
DropTarget dropTarget = new DropTarget(mainFrame, new FileDropListener());
}
if(!SystemUtils.IS_OS_UNIX) {
// no aesthetics for linux users I guess..
setIcon();
}
}
public static String getLocalArtPath(String directoryName) {
// TODO: wtf with all the multiplatform shit? anyone had experience?
URL inputUrl = Main.class.getClassLoader().getResource("art/"+directoryName);
String input;
if(inputUrl != null) {
input = inputUrl.getPath();
} else {
inputUrl = Main.class.getClassLoader().getResource(directoryName);
if(inputUrl != null) {
input = inputUrl.getPath();
} else {
input = "overlap2d/art/" +directoryName;
}
}
File file = new File(input);
if(!file.exists()){
input = "art/"+directoryName;
}
return input;
}
public static void main(String[] argv) throws Exception {
/**
* this should not be happening when in release mode
*/
/**
String input = getLocalArtPath("textures");
String output = "style";
String packFileName = "uiskin";
TexturePacker.Settings settings = new TexturePacker.Settings();
settings.flattenPaths = true;
TexturePacker.processIfModified(input, output, packFileName);
processSplashScreenTextures();
*/
new Main();
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
private static void processSplashScreenTextures() {
String input = getLocalArtPath("splash_textures");
String output = "splash";
String packFileName = "splash";
TexturePacker.Settings settings = new TexturePacker.Settings();
settings.flattenPaths = true;
TexturePacker.processIfModified(input, output, packFileName);
}
private void toggleVisible() {
mainFrame.setVisible(!mainFrame.isVisible());
if (mainFrame.isVisible()) {
mainFrame.toFront();
mainFrame.requestFocus();
mainFrame.setAlwaysOnTop(true);
try {
//remember the last location of mouse
final Point oldMouseLocation = MouseInfo.getPointerInfo().getLocation();
//simulate a mouse click on title bar of window
Robot robot = new Robot();
robot.mouseMove(mainFrame.getX() + 100, mainFrame.getY() + 5);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
//move mouse to old location
robot.mouseMove((int) oldMouseLocation.getX(), (int) oldMouseLocation.getY());
} catch (Exception ex) {
//just ignore exception, or you can handle it as you want
} finally {
mainFrame.setAlwaysOnTop(false);
}
}
}
//THIS IS JUST FOR FUN
private void setIcon(){
String logoPath = getLocalArtPath("splash_textures");
File file = new File(logoPath);
if(!file.exists()){
logoPath = "art/splash_textures/";
file = new File(logoPath);
}
logoPath+="icon.png";
if(mainFrame != null){
mainFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(logoPath));
return;
}
try {
Class util = Class.forName("com.apple.eawt.Application");
Method getApplication = util.getMethod("getApplication", new Class[0]);
Object application = getApplication.invoke(util);
Class params[] = new Class[1];
params[0] = Image.class;
Method setDockIconImage = util.getMethod("setDockIconImage", params);
Image image = Toolkit.getDefaultToolkit().getImage(logoPath);
setDockIconImage.invoke(application, image);
} catch (ClassNotFoundException e) {
// log exception
} catch (NoSuchMethodException e) {
// log exception
} catch (InvocationTargetException e) {
// log exception
} catch (IllegalAccessException e) {
// log exception
}
}
}