/*
* ARX: Powerful Data Anonymization
* Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors
*
* 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 org.deidentifier.arx.gui;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.deidentifier.arx.gui.resources.Resources;
import org.deidentifier.arx.gui.view.impl.MainSplash;
import org.deidentifier.arx.gui.view.impl.MainWindow;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Monitor;
/**
* Main entry point.
*
* @author Fabian Prasser
* @author Florian Kohlmayer
*/
public class Main {
/** Is the project already loaded. */
private static String loaded = null;
/** The splash. */
private static MainSplash splash = null;
/** The main window. */
private static MainWindow main = null;
/**
* Main entry point.
*
* @param args
*/
public static void main(Display display, final String[] args) {
try {
// Make fall-back toolkit look like the native UI
if (!isUnix()) { // See: https://bugs.eclipse.org/bugs/show_bug.cgi?id=341799
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
} catch (ClassNotFoundException | InstantiationException |
IllegalAccessException | UnsupportedLookAndFeelException e) {
// Ignore
}
try {
// Display
if (display == null) {
display = new Display();
}
// Monitor
Monitor monitor = getMonitor(display);
// Splash
splash = new MainSplash(display, monitor);
splash.show();
// Create main window
main = new MainWindow(display, monitor);
// Handler for loading a project
if (args.length > 0 && args[0].endsWith(".deid")) { //$NON-NLS-1$
main.onShow(new Runnable() {
public void run(){
load(main, args[0]);
}
});
}
// Show window
main.show();
new Update(main.getShell());
// Main event loop
while (!main.isDisposed()) {
try {
// Event handling
if (!display.readAndDispatch()) {
display.sleep();
}
} catch (final Exception e) {
// Error handling
main.showErrorDialog(Resources.getMessage("MainWindow.9") + Resources.getMessage("MainWindow.10"), e); //$NON-NLS-1$ //$NON-NLS-2$
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
main.getController().getResources().getLogger().info(sw.toString());
}
}
// Dispose display
if (!display.isDisposed()) {
display.dispose();
}
} catch (Throwable e) {
// Error handling outside of SWT
if (splash != null) splash.hide();
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
final String trace = sw.toString();
// Show message
JOptionPane.showMessageDialog(null, trace, "Unexpected error", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
System.exit(1);
}
}
/**
* Main entry point.
*
* @param args
*/
public static void main(String[] args) {
main(null, args);
}
/**
* Returns the monitor on which the application was launched.
*
* @param display
* @return
*/
private static Monitor getMonitor(Display display) {
Point mouse = display.getCursorLocation();
for (Monitor monitor : display.getMonitors()) {
if (monitor.getBounds().contains(mouse)) {
return monitor;
}
}
return display.getPrimaryMonitor();
}
/**
* Determine os
* @return
*/
private static boolean isUnix() {
String os = System.getProperty("os.name").toLowerCase(); //$NON-NLS-1$
return (os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0 || os.indexOf("aix") > 0 ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
/**
* Loads a project.
*
* @param main
* @param path
*/
private static void load(MainWindow main, String path) {
if (loaded == null) {
loaded = path;
if (splash != null) splash.hide();
main.getController().actionOpenProject(path);
}
}
}