package com.frinika;
import com.frinika.global.FrinikaConfig;
import com.frinika.global.Toolbox;
import static com.frinika.localization.CurrentLocale.getMessage;
import com.frinika.project.FrinikaAudioSystem;
import com.frinika.project.ProjectContainer;
import com.frinika.project.gui.ProjectFocusListener;
import com.frinika.project.gui.ProjectFrame;
import com.frinika.sequencer.gui.menu.CreateProjectAction;
import com.frinika.sequencer.gui.menu.OpenProjectAction;
import com.frinika.settings.SetupDialog;
import com.frinika.tootX.midi.MidiInDeviceManager;
import com.jgoodies.looks.plastic.PlasticLookAndFeel;
import com.jgoodies.looks.plastic.PlasticXPLookAndFeel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.UIManager;
import net.roydesign.app.Application;
/*
* Created on Mar 6, 2006
*
* Copyright (c) 2004-2006 Peter Johan Salomonsen (http://www.petersalomonsen.com)
*
* http://www.frinika.com
*
* This file is part of Frinika.
*
* Frinika is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Frinika is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Frinika; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* The main entry class for Frinika
*
* @author Peter Johan Salomonsen
*/
public class FrinikaMain {
static FrinikaExitHandler exitHook = null;
/**
* @param args
*/
public static void main(String[] args) throws Exception {
prepareRunningFromSingleJar();
configureUI();
try {
int n = 1;
Object[] options = { getMessage("welcome.new_project"),
getMessage("welcome.open_existing"),
getMessage("welcome.settings"), getMessage("welcome.quit") };
//String setup = FrinikaConfig.getProperty("multiplexed_audio");
WelcomeDialog welcome= new WelcomeDialog(options);
//if (setup == null) {
if ( !FrinikaConfig.SETUP_DONE ) {
// welcome = new WelcomeDialog(options);
welcome.setModal(false);
welcome.setVisible(true);
SetupDialog.showSettingsModal();
welcome.setVisible(false);
}
welcome.setModal(true);
welcome.addButtonActionListener(2, new ActionListener() {
public void actionPerformed(ActionEvent e) {
SetupDialog.showSettingsModal();
}
});
welcome.setVisible(true);
n = welcome.getSelectedOption();
switch (n) {
case -1:
System.exit(0);
break;
case 0:
// new ProjectFrame(new ProjectContainer());
SplashDialog.showSplash();
new CreateProjectAction().actionPerformed(null);
break;
case 1:
SplashDialog.showSplash();
String lastFile = FrinikaConfig.lastProjectFile();
if (lastFile != null)
OpenProjectAction.setSelectedFile(new File(lastFile));
new OpenProjectAction().actionPerformed(null);
break;
case 3:
System.exit(0);
break;
default:
assert (false);
}
} catch (Exception e) {
e.printStackTrace();
System.exit(-1); // new ProjectFrame(new ProjectContainer());
}
exitHook = new FrinikaExitHandler();
Runtime.getRuntime().addShutdownHook(exitHook);
ProjectFrame.addProjectFocusListener(new ProjectFocusListener() {
public void projectFocusNotify(ProjectContainer project) {
FrinikaAudioSystem.installClient(project.getAudioClient());
}
});
SplashDialog.closeSplash();
FrinikaAudioSystem.getAudioServer().start();
}
private static boolean ismac = false;
public static boolean isMac() {
return ismac;
}
private static void configureUI() {
String lcOSName = System.getProperty("os.name").toLowerCase();
try {
UIManager.setLookAndFeel(new PlasticXPLookAndFeel());
} catch (Exception e) {
e.printStackTrace();
}
}
static class FrinikaExitHandler extends Thread {
public void run() {
MidiInDeviceManager.close();
FrinikaAudioSystem.close();
// SwingUtilities.invokeLater(new Runnable() {
// public void run() {
// System.out.println(" Closing ALL midi devices ");
// ProjectContainer.closeAllMidiOutDevices();
// }
// });
}
}
/**
* Detect whether running from a single .jar-file (e.g. via "java -jar frinika.jar").
* In this case, copy native binary libraries to a file-system accessible location
* where the JVM can load them from.
* (There is a comparable mechanism already implemented in
* com.frinika.priority.Priority, but this here works for all native libraries,
* esp. libjjack.so.)
* (Jens)
*/
public static void prepareRunningFromSingleJar() {
String classpath = System.getProperty("java.class.path");
if ( classpath.indexOf(File.pathSeparator) == -1 ) { // no pathSeparator: single entry classpath
if (classpath.endsWith(".jar")) {
File file = new File(classpath);
if (file.exists() && file.isFile()) { // yes, running from 1 jar
String osarch = System.getProperty("os.arch");
String osname = System.getProperty("os.name");
String libPrefix = "lib/" + osarch + "/" + osname + "/";
String tmp = System.getProperty("java.io.tmpdir");
File tmpdir = new File(tmp);
try {
System.out.println("extracting files from "+libPrefix+" to "+tmpdir.getAbsolutePath()+":");
Toolbox.extractFromJar(file, libPrefix, tmpdir);
System.setProperty("java.library.path", tmp);
} catch (IOException ioe) {
System.err.println("Native library extraction failed. Problems may occur.");
ioe.printStackTrace();
}
}
}
}
}
}