/*
* Created on 23-Feb-2007
*
* Copyright (c) 2006-2007 P.J.Leonard
*
* 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
*/
package com.frinika.simphoney;
import com.frinika.simphoney.Simphoney2Frame;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
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;
import com.frinika.About;
import com.frinika.SplashDialog;
import com.frinika.WelcomeDialog;
import com.frinika.project.FrinikaAudioSystem;
import com.frinika.global.FrinikaConfig;
import com.frinika.global.Toolbox;
import com.frinika.tootX.midi.MidiInDeviceManager;
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.toot.SwitchedAudioClient;
import static com.frinika.localization.CurrentLocale.getMessage;
import com.jgoodies.looks.plastic.PlasticLookAndFeel;
import com.jgoodies.looks.plastic.PlasticXPLookAndFeel;
/*
* 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 Simphoney
*
* Adapted from FrinikaMain
*
* @author Peter Johan Salomonsen PJ Leonard
*/
public class Simphoney2Main {
static FrinikaExitHandler exitHook = null;
private static ProjectFrame project;
/**
* @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();
CreateProjectAction act = new CreateProjectAction();
act.actionPerformed(null);
project = act.getProjectFrame();// .getProjectContainer();
break;
case 1:
SplashDialog.showSplash();
String lastFile = FrinikaConfig.lastProjectFile();
if (lastFile != null)
OpenProjectAction.setSelectedFile(new File(lastFile));
OpenProjectAction oact = new OpenProjectAction();
oact.actionPerformed(null);
project = oact.getProjectFrame();// .getProjectContainer();
break;
case 3:
System.exit(0);
break;
default:
assert (false);
}
} catch (Exception e) {
e.printStackTrace();
System.exit(-1); // new ProjectFrame(new ProjectContainer());
}
// project.setBounds(screenPos());
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();
// EditHistoryListener listener=new MusicListener(project,new
// WhiteNoteMusicProcess());
new Simphoney2Frame(project);
// project.perspectivePreset3();
}
static Rectangle screenPos() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Rectangle windowSize;
Insets windowInsets;
GraphicsEnvironment ge = java.awt.GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice()
.getDefaultConfiguration();
// if (gc == null)
// gc = JFrame.getGraphicsConfiguration();
if (gc != null) {
windowSize = gc.getBounds();
windowInsets = toolkit.getScreenInsets(gc);
} else {
windowSize = new java.awt.Rectangle(toolkit.getScreenSize());
windowInsets = new java.awt.Insets(0, 0, 0, 0);
}
// PJL using xrandr and a virtual screen 2560x1024 then windowSize.x
// == windowSize.width=1280;
windowSize.x = 0;
int w = (windowSize.width - windowSize.x)
- (windowInsets.left + windowInsets.right + 10);
int h = (windowSize.height - windowSize.y)
- (windowInsets.top + windowInsets.bottom + 10);
int y = windowInsets.top
+ ((windowSize.height - windowSize.y)
- (windowInsets.top + windowInsets.bottom) - h) / 2;
int x = windowInsets.left
+ ((windowSize.width - windowSize.x)
- (windowInsets.left + windowInsets.right) - w) / 2;
return new Rectangle(x+w/2,y,w/2,(int)(h*.6));
}
private static boolean ismac = false;
public static boolean isMac() {
return ismac;
}
private static void configureUI_MacOS() {
try {
ismac = true;
System.setProperty("apple.laf.useScreenMenuBar", "true");
System.setProperty(
"com.apple.mrj.application.apple.menu.about.name",
"Frinika");
Object cMenuBarUI = UIManager.get("MenuBarUI");
Object cMenuItemUI = UIManager.get("MenuItemUI");
Object cMenuUI = UIManager.get("MenuUI");
Object cCheckBoxMenuItemUI = UIManager.get("CheckBoxMenuItemUI");
Object cRadioButtonMenuItemUI = UIManager
.get("RadioButtonMenuItemUI");
Object cPopupMenuUI = UIManager.get("PopupMenuUI");
Object cProgressBarUI = UIManager.get("ProgressBarUI");
UIManager.setLookAndFeel(new PlasticLookAndFeel());
UIManager.put("MenuBarUI", cMenuBarUI);
UIManager.put("MenuItemUI", cMenuItemUI);
UIManager.put("MenuUI", cMenuUI);
UIManager.put("CheckBoxMenuItemUI", cCheckBoxMenuItemUI);
UIManager.put("RadioButtonMenuItemUI", cRadioButtonMenuItemUI);
UIManager.put("PopupMenuUI", cPopupMenuUI);
UIManager.put("ProgressBarUI", cProgressBarUI);
Application.getInstance().getAboutJMenuItem().addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
About.about(null);
}
});
Application.getInstance().getQuitJMenuItem().addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
ProjectFrame.getFocusFrame().tryQuit();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private static void configureUI() {
String lcOSName = System.getProperty("os.name").toLowerCase();
boolean MAC_OS_X = lcOSName.startsWith("mac os x");
if (MAC_OS_X) {
configureUI_MacOS();
return;
}
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();
}
}
}
}
}
}