package com.frinika.project.gui;
import com.frinika.About;
import com.frinika.FrinikaMain;
import com.frinika.global.ConfigError;
import com.frinika.global.ConfigListener;
import com.frinika.global.FrinikaConfig;
import static com.frinika.localization.CurrentLocale.getMessage;
import com.frinika.mod.MODImporter;
import com.frinika.notation.NotationPanel;
import com.frinika.project.FrinikaAudioSystem;
import com.frinika.project.ProjectContainer;
import com.frinika.project.mididevices.gui.MidiDevicesPanel;
import com.frinika.radio.LocalOGGHttpRadio;
import com.frinika.sequencer.FrinikaSequencer;
import com.frinika.sequencer.gui.GlobalToolBar;
import com.frinika.sequencer.gui.menu.CreateAudioLaneAction;
import com.frinika.sequencer.gui.menu.CreateMidiDrumLaneAction;
import com.frinika.sequencer.gui.menu.CreateMidiLaneAction;
import com.frinika.sequencer.gui.menu.CreateProjectAction;
import com.frinika.sequencer.gui.menu.CreateTextLaneAction;
import com.frinika.sequencer.gui.menu.CutPasteMenu;
import com.frinika.sequencer.gui.menu.DisplayStructureAction;
import com.frinika.sequencer.gui.menu.GuiCursorUpdateMenu;
import com.frinika.sequencer.gui.menu.ImportAudioAction;
import com.frinika.sequencer.gui.menu.ImportMidiToLaneAction;
import com.frinika.sequencer.gui.menu.MidiIMonitorAction;
import com.frinika.sequencer.gui.menu.MidiInSetupAction;
import com.frinika.sequencer.gui.menu.RepeatAction;
import com.frinika.sequencer.gui.menu.SetAudioOutputAction;
import com.frinika.sequencer.gui.menu.SplitSelectedPartsAction;
import com.frinika.sequencer.gui.menu.TempoListEditAction;
import com.frinika.sequencer.gui.menu.TimeSignatureEditAction;
import com.frinika.sequencer.gui.menu.ToggleShowVoiceViewAction;
import com.frinika.sequencer.gui.menu.WarpToLeftAction;
import com.frinika.sequencer.gui.menu.WarpToRightAction;
import com.frinika.sequencer.gui.menu.midi.GroovePatternCreateFromMidiPartAction;
import com.frinika.sequencer.gui.menu.midi.GroovePatternManagerAction;
import com.frinika.sequencer.gui.menu.midi.MidiDurationAction;
import com.frinika.sequencer.gui.menu.midi.MidiInsertControllersAction;
import com.frinika.sequencer.gui.menu.midi.MidiQuantizeAction;
import com.frinika.sequencer.gui.menu.midi.MidiReverseAction;
import com.frinika.sequencer.gui.menu.midi.MidiShiftAction;
import com.frinika.sequencer.gui.menu.midi.MidiStepRecordAction;
import com.frinika.sequencer.gui.menu.midi.MidiTimeStretchAction;
import com.frinika.sequencer.gui.menu.midi.MidiTransposeAction;
import com.frinika.sequencer.gui.menu.midi.MidiVelocityAction;
import com.frinika.sequencer.gui.mixer.SynthWrapper;
import com.frinika.sequencer.gui.partview.VoicePartViewSplitPane;
import com.frinika.sequencer.gui.pianoroll.PianoControllerSplitPane;
import com.frinika.sequencer.gui.tracker.TrackerPanel;
import com.frinika.sequencer.gui.transport.RecordAction;
import com.frinika.sequencer.gui.transport.RewindAction;
import com.frinika.sequencer.gui.transport.StartStopAction;
import com.frinika.sequencer.model.AudioLane;
import com.frinika.sequencer.model.EditHistoryAction;
import com.frinika.sequencer.model.EditHistoryListener;
import com.frinika.sequencer.model.Lane;
import com.frinika.sequencer.model.Part;
import com.frinika.tools.BufferedPlayback;
import com.frinika.tootX.gui.FrinikaMixerPanel;
import com.frinika.tootX.gui.MidiLearnPanel;
import com.frinika.tootX.midi.MidiInDeviceManager;
import com.frinika.tootX.midi.MidiLearnIF;
import com.frinika.tracker.MidiFileFilter;
import com.frinika.tracker.ProjectFileFilter;
import com.frinika.tracker.filedialogs.BounceToLane;
import com.frinika.tracker.filedialogs.ExportWavDialog;
import com.frinika.versionmanagement.AutomaticVersionCheck;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Insets;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Synthesizer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.text.JTextComponent;
import org.flexdock.docking.Dockable;
import org.flexdock.docking.DockingConstants;
import org.flexdock.docking.DockingManager;
import org.flexdock.docking.state.DockingState;
import org.flexdock.view.View;
import org.flexdock.view.Viewport;
import uk.org.toot.swingui.audioui.mixerui.CompactMixerPanel;
/*
* Created on Mar 6, 2006
*
* Copyright (c) 2004-2006 Peter Johan Salomonsen (http://www.petersalomonsen.com)
*
* Copyright (c) 2007 Karl Helgason (added flexdock support)
*
* 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
*/
/**
* Frinika is designed to have one basis frame per project. A projectframe is
* the main window for a project.
*
* @author Peter Johan Salomonsen
*/
public class ProjectFrame extends JFrame {
private static final long serialVersionUID = 1L;
/**
* File-filter for midi standard files. To be used with promptFile().
*
* @see promptFile
*/
public final static String[][] FILE_FILTER_MIDIFILES = new String[][] { {
"mid", "Midi standard files" } };
/**
* Vector containing currently open project frames
*/
private static Vector<ProjectFrame> openProjectFrames = new Vector<ProjectFrame>();
private static ProjectFrame focusFrame = null;
private static Vector<ProjectFocusListener> projectFocusListeners = new Vector<ProjectFocusListener>();
// hack to stop exit when last frma is closed.
public static boolean doNotQuit=false;
// PianoRollEditor pianoRollEditor;
public static ProjectFrame findFrame(ProjectContainer project) {
for (ProjectFrame pr : openProjectFrames) {
if (pr.project == project)
return pr;
}
return null; // Frame wasn't found
}
TrackerPanel trackerPanel;
PianoControllerSplitPane pianoControllerPane;
NotationPanel notationPanel;
VoicePartViewSplitPane partViewEditor;
GlobalToolBar globalToolBar;
ProjectContainer project;
private File midiFile;
private StartStopAction startStop;
private RewindAction rewind;
private WarpToLeftAction warpToLeft;
private WarpToRightAction warpToRight;
private Viewport viewport;
private RecordAction record;
private Rectangle position;
private MidiLearnPanel midiLearnFrame;
private boolean withRef=false;
// private List<Action> audioPartContextActions = new ArrayList<Action>();
// private List<Action> midiPartContextActions = new ArrayList<Action>();
public JPopupMenu newLaneMenu = new JPopupMenu();
private StatusBar statusBar;
public ProjectFrame(final ProjectContainer project) throws Exception {
this(project, null);
}
public ProjectFrame(final ProjectContainer project, Rectangle position)
throws Exception {
this.position = position;
project.resetEndTick();
// This might be useful for more placement control.
// Dimension frameSize = Toolkit.getDefaultToolkit().getScreenSize();
final Receiver receiver = project.getSequencer().getReceiver();
midiLearnFrame= new MidiLearnPanel(project.getMidiDeviceRouter());
/*
* Vector<String> midiInList = FrinikaConfig.getMidiInDeviceList(); for
* (String name : midiInList) { MidiDevice midiIn = null; // TOOT_FIXME
* MidiHub.getMidiInDeviceByName(name); * PJS: I use a USB midi device
* that I unplug every now and then without this test I'm not able to
* reopen my projects if I don't have this midi device
*
* PJL: Should we ask for replacement devices here ?
*
*
* if (midiIn != null) { try { midiIn.open();
* midiIn.getTransmitter().setReceiver(receiver); System.
* out.println(midiIn + " ---> " + receiver); } catch (Exception e) {
* e.printStackTrace(); } } else System. out.println("Couldn't reopen
* mididevice: " + name); }
*/
MidiInDeviceManager.setProject(project);
addWindowListener(new WindowListener() {
public void windowOpened(WindowEvent arg0) {
// System.out.println();
// TODO Auto-generated method stub
}
public void windowClosing(WindowEvent evt) {
// System.out.println();
if (openProjectFrames.size() == 1 && ! doNotQuit)
tryQuit();
else {
if (canClose())
evt.getWindow().dispose();
}
}
public void windowClosed(WindowEvent arg0) {
}
public void windowIconified(WindowEvent arg0) {
}
public void windowDeiconified(WindowEvent arg0) {
}
public void windowActivated(WindowEvent arg0) {
// System.out.println(" activated ");
ProjectFrame.setFocusFrame(ProjectFrame.this);
ProjectFrame.notifyProjectFocusListeners();
// try {
// MidiInDeviceManager.setReceiver(project.getSequencer()
// .getReceiver());
//
MidiInDeviceManager.setProject(project);
//
// } catch (MidiUnavailableException e) {
// e.printStackTrace();
// }
}
public void windowDeactivated(WindowEvent arg0) {
}
});
// TODO save positioning into config
if (false)
addComponentListener(new ComponentListener() {
public void componentHidden(ComponentEvent e) {
}
public void componentMoved(ComponentEvent e) {
info();
}
public void componentResized(ComponentEvent e) {
info();
}
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
void info() {
GraphicsConfiguration gc = ProjectFrame.this
.getGraphicsConfiguration();
System.out.println(gc);
System.out.println(ProjectFrame.this.getBounds());
}
});
this.project = project;
/*
* Rectangle windowSize = GraphicsEnvironment
* .getLocalGraphicsEnvironment().getDefaultScreenDevice()
* .getDefaultConfiguration().getBounds();
*/
/*
* Point p = GraphicsEnvironment.getLocalGraphicsEnvironment()
* .getCenterPoint(); Dimension frameSize = new
* Dimension(windowSize.getSize()); setSize(frameSize); setLocation(0,
* 0);
*/
Dimension frameSize;
int x;
int y;
if (position == null) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Rectangle windowSize;
Insets windowInsets;
GraphicsEnvironment ge = java.awt.GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice()
.getDefaultConfiguration();
if (gc == null)
gc = 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);
y = windowInsets.top
+ ((windowSize.height - windowSize.y)
- (windowInsets.top + windowInsets.bottom) - h) / 2;
x = windowInsets.left
+ ((windowSize.width - windowSize.x)
- (windowInsets.left + windowInsets.right) - w) / 2;
frameSize = new Dimension(w, h);
setSize(new Dimension(w - 1, h - 1));
} else {
frameSize = position.getSize();
y = position.y;
x = position.x;
}
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setIconImage(new javax.swing.ImageIcon(ProjectFrame.class
.getResource("/icons/frinika.png")).getImage());
String name = "Frinika - Copyright (c) Frinika developers - Licensed under GNU General Public License";
File file = project.getProjectFile();
if (file != null)
name = file.getName();
setTitle(name);
project.getEditHistoryContainer().addEditHistoryListener(
new EditHistoryListener() {
/**
* An asterix sign next to the project title indicating if
* edits have been done
*/
boolean showAsterix = false;
public void fireSequenceDataChanged(
EditHistoryAction[] edithistoryEntries) {
if (project.getEditHistoryContainer().hasChanges() != showAsterix) {
showAsterix = project.getEditHistoryContainer()
.hasChanges();
if (showAsterix)
setTitle(getTitle() + "*");
else
setTitle(getTitle().substring(0,
getTitle().length() - 1));
}
}
});
// Karl, flexdock, use -Dfrinika.window.flexdock=no to disble flexdock
if (System.getProperty("frinika.window.flexdock") == null) {
DockingManager.setFloatingEnabled(true);
viewport = new Viewport();
}
createMenu();
globalToolBar = new GlobalToolBar(this);
JPanel content = new JPanel(new BorderLayout());
setContentPane(content);
content.add(globalToolBar, BorderLayout.NORTH);
if (viewport == null) {
JTabbedPane midPanels = new JTabbedPane();
content.add(midPanels, BorderLayout.CENTER);
midPanels.addTab(getMessage("project.maintabs.tracks"),
createSplit(frameSize));
midPanels.addTab(getMessage("project.maintabs.midiout_devices"),
new JScrollPane(midiDevicesPanel = new MidiDevicesPanel(
this)));
midPanels.addTab(getMessage("project.maintabs.audiomixer"),
new FrinikaMixerPanel(project.getMixerControls(),midiLearnFrame));
} else {
content.add(viewport,BorderLayout.CENTER);
initViews();
perspectivePreset1();
}
statusBar=new StatusBar();
content.add(statusBar,BorderLayout.SOUTH);
validate();
setVisible(true);
// setVisible before setSize assures that the window doesn't open blank
// (happens always when using XGL (compiz/beryl))
setSize(frameSize);
setLocation(x, y);
openProjectFrames.add(this);
overRideKeys();
if (FrinikaConfig.MAXIMIZE_WINDOW) {
this.setExtendedState(MAXIMIZED_BOTH);
}
}
private static Icon maximize_icon = new javax.swing.ImageIcon(
ProjectFrame.class.getResource("/icons/maximize.gif"));
private static Icon minimize_icon = new javax.swing.ImageIcon(
ProjectFrame.class.getResource("/icons/minimize.gif"));
public MidiLearnIF getMidiLearnIF() {
return midiLearnFrame;
}
public void resetViews() {
Iterator iter = views.values().iterator();
while (iter.hasNext()) {
View view = (View) iter.next();
if (view.isMinimized())
DockingManager.setMinimized((Dockable) view, false);
DockingManager.undock((Dockable) view);
}
viewport.grabFocus();
}
public void repaintViews() {
partViewEditor.repaint();
repaintPartView();
// TODO repaint others if needed
}
public void repaintPartView() {
partViewEditor.getPartview().repaint();
partViewEditor.getPartview().repaintItems();
}
JMenu perspectivemenu;
JMenu perspective_showmenu;
JMenu perspectiveMenu() {
JMenu menu = perspectivemenu = new JMenu(
getMessage("project.menu.perspectives"));
menu.setMnemonic(KeyEvent.VK_P);
JMenuItem item = new JMenuItem(
getMessage("project.menu.perspectives.Default_Perspective"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
perspectivePreset1();
}
});
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()));
menu.add(item);
item = new JMenuItem(
getMessage("project.menu.perspectives.Mastering_Perspective"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
perspectivePreset2();
}
});
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()));
menu.add(item);
item = new JMenuItem(
getMessage("project.menu.perspectives.Minimal_Perspective"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
perspectivePreset3();
}
});
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()));
menu.add(item);
menu.addSeparator();
perspective_showmenu = new JMenu("Show View");
menu.add(perspective_showmenu);
return menu;
}
private class LateRunnable implements Runnable {
Runnable runnable;
public LateRunnable(Runnable runnable) {
this.runnable = runnable;
}
public void run() {
try {
SwingUtilities.invokeAndWait(runnable);
Thread.sleep(200);
SwingUtilities.invokeAndWait(runnable);
Thread.sleep(200);
SwingUtilities.invokeAndWait(runnable);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// HACK for flexdock
public void runReallyLater(Runnable runnable) {
new Thread(new LateRunnable(runnable)).start();
}
public void perspectivePreset1() {
resetViews();
viewport.dock(getView("tracks"));
getView("tracks").dock(getView("pianoroll"),
DockingConstants.SOUTH_REGION);
getView("tracks").dock(getView("voice"), DockingConstants.WEST_REGION);
getView("pianoroll").dock(getView("tracker"));
getView("pianoroll").dock(getView("notation"));
getView("tracks").dock(getView("midiout"));
getView("tracks").dock(getView("mixer"));
((JSplitPane) getView("voice").getParent().getParent())
.setDividerLocation(300);
((JTabbedPane) getView("tracks").getParent()).setSelectedIndex(0);
((JTabbedPane) getView("pianoroll").getParent()).setSelectedIndex(0);
viewport.grabFocus();
validate();
repaint();
Runnable runnable = new Runnable() {
public void run() {
((JTabbedPane) getView("tracks").getParent())
.setSelectedIndex(0);
((JTabbedPane) getView("pianoroll").getParent())
.setSelectedIndex(0);
viewport.grabFocus();
}
};
runReallyLater(runnable);
}
public void perspectivePreset2() {
resetViews();
viewport.dock(getView("tracks"));
getView("tracks").dock(getView("mixer"), DockingConstants.EAST_REGION,
0.25f);
getView("tracks").dock(getView("pianoroll"),
DockingConstants.SOUTH_REGION);
getView("tracks").dock(getView("voice"), DockingConstants.WEST_REGION,
0.3f);
getView("pianoroll").dock(getView("tracker"));
getView("pianoroll").dock(getView("notation"));
getView("tracks").dock(getView("midiout"));
((JSplitPane) getView("voice").getParent().getParent())
.setDividerLocation(300);
((JTabbedPane) getView("tracks").getParent()).setSelectedIndex(0);
((JTabbedPane) getView("pianoroll").getParent()).setSelectedIndex(0);
viewport.grabFocus();
validate();
repaint();
Runnable runnable = new Runnable() {
public void run() {
((JTabbedPane) getView("tracks").getParent())
.setSelectedIndex(0);
((JTabbedPane) getView("pianoroll").getParent())
.setSelectedIndex(0);
viewport.grabFocus();
}
};
runReallyLater(runnable);
}
public void perspectivePreset3() {
resetViews();
viewport.dock(getView("tracks"));
getView("tracks").dock(getView("voice"), DockingConstants.WEST_REGION);
getView("tracks").dock(getView("pianoroll"));
getView("tracks").dock(getView("tracker"));
getView("tracks").dock(getView("notation"));
getView("tracks").dock(getView("midiout"));
getView("tracks").dock(getView("mixer"));
((JSplitPane) getView("voice").getParent().getParent())
.setDividerLocation(300);
((JTabbedPane) getView("tracks").getParent()).setSelectedIndex(0);
DockingManager.setMinimized(getView("voice"), true, DockingState.LEFT);
viewport.grabFocus();
validate();
repaint();
Runnable runnable = new Runnable() {
public void run() {
((JTabbedPane) getView("tracks").getParent())
.setSelectedIndex(0);
viewport.grabFocus();
}
};
runReallyLater(runnable);
}
public void initViews() {
partViewEditor = new VoicePartViewSplitPane(this, true);
JComponent partViewEditor = this.partViewEditor.getPartViewEditor();
JComponent laneView = this.partViewEditor.getLaneView();
notationPanel = new NotationPanel(this);
pianoControllerPane = new PianoControllerSplitPane(this);
trackerPanel = new TrackerPanel(project.getSequence(), this);
trackerPanel.setOpaque(false);
JPanel mixer = new JPanel();
mixer.setLayout(new BorderLayout());
try {
/*
* Class clazz =
* Class.forName("uk.org.toot.swingui.audioui.meterui.KMeterPanel");
* Field field = clazz.getDeclaredField("factory");
* field.setAccessible(true); if(field.get(null) == null) {
* System.err.println("factory has been nulled in KMeterPanel - Work
* around is in effect!");
* System.err.println("------------------------------------------------------------------");
* field.set(null, new MeterPanelFactory()); }
*/
mixer.add(new FrinikaMixerPanel(project.getMixerControls(),midiLearnFrame));
// mixer.add(new CompactMixerPanel(project.getMixerControls()));
} catch (Throwable t) {
// Sometimes java.lang.NullPointerException occurs in mixer
// at
// uk.org.toot.swingui.controlui.CompoundControlPanel.<init>(CompoundControlPanel.java:44)
t.printStackTrace();
}
project.getPartSelection().addSelectionListener(trackerPanel);
laneView.setPreferredSize(new Dimension(0, 0));
partViewEditor.setPreferredSize(new Dimension(0, 0));
pianoControllerPane.setPreferredSize(new Dimension(0, 0));
pianoControllerPane.setOpaque(false);
trackerPanel.setPreferredSize(new Dimension(0, 0));
mixer.setPreferredSize(new Dimension(0, 0));
laneView.setMinimumSize(new Dimension(0, 0));
partViewEditor.setMinimumSize(new Dimension(0, 0));
pianoControllerPane.setMinimumSize(new Dimension(0, 0));
trackerPanel.setMinimumSize(new Dimension(0, 0));
mixer.setMinimumSize(new Dimension(0, 0));
createView("tracks", getMessage("project.maintabs.tracks"),
partViewEditor, dockicon_tracks);
createView("voice", getMessage("project.maintabs.lane_properties"), laneView, dockicon_voice);
createView("pianoroll", getMessage("project.maintabs.piano_roll"), pianoControllerPane,
dockicon_pianoroll);
createView("tracker", getMessage("project.maintabs.tracker"), trackerPanel, dockicon_tracker);
createView("notation", getMessage("project.maintabs.notation"), notationPanel, dockicon_notation);
createView("midiout", getMessage("project.maintabs.midimixer"),
new JScrollPane(midiDevicesPanel = new MidiDevicesPanel(this)),
dockicon_midiout);
createView("mixer", getMessage("project.maintabs.audiomixer"), mixer,
dockicon_mixer);
}
public static Icon getIconResource(String name) {
try {
Icon icon = new javax.swing.ImageIcon(ProjectFrame.class
.getResource("/icons/" + name));
return icon;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static Icon dockicon_tracks = getIconResource("track.gif");
private static Icon dockicon_tracker = getIconResource("tracker.gif");
private static Icon dockicon_midiout = getIconResource("midi_mixer.gif");
private static Icon dockicon_voice = getIconResource("properties.gif");
private static Icon dockicon_pianoroll = getIconResource("piano.png");
private static Icon dockicon_mixer = getIconResource("mixer.gif");
private static Icon dockicon_notation = getIconResource("midilane.png");
private static Icon default_midi_icon = getIconResource("midi.png");
public static Icon getMidiDeviceIcon(MidiDevice dev) {
Icon icon = getMidiDeviceLargeIcon(dev);
if (icon.getIconHeight() > 16 || icon.getIconWidth() > 16) {
BufferedImage img = new BufferedImage(icon.getIconWidth(), icon
.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g = img.createGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
Image im = img.getScaledInstance(16, 16, Image.SCALE_SMOOTH);
icon = new ImageIcon(im);
}
return icon;
}
public static Icon getMidiDeviceLargeIcon(MidiDevice dev) {
if (dev instanceof SynthWrapper) {
dev = ((SynthWrapper) dev).getRealDevice();
}
Icon icon = default_midi_icon;
try {
Method icon_method = dev.getClass().getMethod("getIcon");
icon = (Icon) icon_method.invoke(dev);
} catch (Exception e) {
}
return icon;
}
private Map views = new HashMap();
private View getView(String id) {
return (View) views.get(id);
}
private View createView(String id, String text, JComponent content,
Icon icon) {
final View view = new View(id, text);
if (icon != null)
view.setIcon(icon);
if (icon != null)
view.setTabIcon(icon);
views.put(id, view);
JMenuItem menuitem = new JMenuItem(text);
menuitem.setIcon(icon);
menuitem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DockingManager.undock((Dockable) view);
Set dockables = viewport.getDockables();
if (dockables.size() == 0)
viewport.dock(view);
else
((View) dockables.iterator().next()).dock(view);
validate();
repaint();
}
});
perspective_showmenu.add(menuitem);
Action max_action = new AbstractAction() {
private static final long serialVersionUID = 1L;
public Object getValue(String key) {
if (key.equals("Name"))
return "maximize";
if (key.equals("ShortDescription"))
return "Maximize";
if (key.equals("SmallIcon"))
return maximize_icon;
return super.getValue(key);
}
public void actionPerformed(ActionEvent e) {
DockingManager.toggleMaximized((Dockable) view);
focusFrame.repaint();
DockingManager.display((Dockable) view);
}
};
// Action min_action = new AbstractAction() {
// private static final long serialVersionUID = 1L;
//
// public Object getValue(String key) {
// if (key.equals("Name"))
// return "minimize";
// if (key.equals("ShortDescription"))
// return "Minimize";
// if (key.equals("SmallIcon"))
// return minimize_icon;
// return super.getValue(key);
// }
//
// public void actionPerformed(ActionEvent e) {
// DockingManager.setMinimized((Dockable) view,true);
// focusFrame.repaint();
// DockingManager.display((Dockable) view);
// }
//
// };
view.addAction(View.CLOSE_ACTION);
view.getTitlebar().addAction(max_action);
// view.getTitlebar().addAction(min_action);
view.addAction(View.PIN_ACTION);
view.getTitlebar().addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
DockingManager.toggleMaximized((Dockable) view);
ProjectFrame.this.repaint();
DockingManager.display((Dockable) view);
return;
}
super.mouseClicked(e);
}
});
view.setContentPane(content);
return view;
}
protected static void setFocusFrame(ProjectFrame frame) {
if (frame != focusFrame) {
focusFrame = frame;
System.out.println(" Setting focus project "
+ frame.getProjectContainer().getFile());
}
}
public static ProjectFrame getFocusFrame() {
return focusFrame;
}
/**
* Grab some keys before the focus manager gets them !!!! TODO discuss this.
* Maybe better to have a focus panes and grab the keyboard for each of
* these ?
*/
void overRideKeys() {
startStop = new StartStopAction(this);
rewind = new RewindAction(this);
record = new RecordAction(this);
warpToLeft = new WarpToLeftAction(this);
warpToRight = new WarpToRightAction(this);
final SelectAllAction selectAllAction = new SelectAllAction(this);
KeyboardFocusManager kbm = KeyboardFocusManager
.getCurrentKeyboardFocusManager();
kbm.addKeyEventDispatcher(new KeyEventDispatcher() {
public boolean dispatchKeyEvent(KeyEvent e) {
if (!ProjectFrame.this.isActive())
return false;
// Let text components have all key hits
if (e.getSource() instanceof JTextComponent)
return false;
switch (e.getKeyCode()) {
case KeyEvent.VK_SPACE:
if ((e.getID() == KeyEvent.KEY_PRESSED)) {
startStop.actionPerformed(null);
}
return true;
case KeyEvent.VK_HOME:
if ((e.getID() == KeyEvent.KEY_PRESSED)) {
rewind.actionPerformed(null);
}
return true;
case KeyEvent.VK_MULTIPLY:
if ((e.getID() == KeyEvent.KEY_PRESSED)) {
record.actionPerformed(null);
}
return true;
case KeyEvent.VK_NUMPAD1:
if ((e.getID() == KeyEvent.KEY_PRESSED)) {
warpToLeft.actionPerformed(null);
}
return true;
case KeyEvent.VK_NUMPAD2:
if ((e.getID() == KeyEvent.KEY_PRESSED)) {
warpToRight.actionPerformed(null);
}
return true;
case KeyEvent.VK_A:
if ((e.getID() == KeyEvent.KEY_PRESSED)) {
if (e.isControlDown()) {
return selectAllAction.selectAll(e);
}
}
default:
return false;
}
}
});
}
public static void openLocalProject() {
}
JMenu fileMenu() {
JMenu fileMenu = new JMenu(getMessage("project.menu.file"));
final JMenuItem newProjectMenuItem = new JMenuItem(
getMessage("project.menu.file.new_project"));
newProjectMenuItem.setIcon(getIconResource("new.gif"));
newProjectMenuItem.addActionListener(new CreateProjectAction());
fileMenu.add(newProjectMenuItem);
final JMenuItem openProjectMenuItem = new JMenuItem(
getMessage("project.menu.file.open_project"));
openProjectMenuItem.setIcon(getIconResource("open.gif"));
openProjectMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
JFileChooser chooser = new JFileChooser();
chooser
.setDialogTitle(getMessage("project.menu.file.open_project.dialogtitle"));
chooser.setFileFilter(new ProjectNewFileFilter());
if (project.getProjectFile() != null)
chooser.setSelectedFile(project.getProjectFile());
if (chooser.showOpenDialog(ProjectFrame.this) == JFileChooser.APPROVE_OPTION) {
File newProject = chooser.getSelectedFile();
new ProjectFrame(ProjectContainer
.loadProject(newProject), position);
// FrinikaConfig.setLastProjectFilename(newProject
// .getAbsolutePath());
}
;
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
fileMenu.add(openProjectMenuItem);
final JMenuItem closeMenuItem = new JMenuItem(getMessage("close"));
closeMenuItem.setMnemonic(KeyEvent.VK_C);
closeMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
closeMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (openProjectFrames.size() == 1)
tryQuit();
else if (canClose())
dispose();
}
});
fileMenu.add(closeMenuItem);
fileMenu.add(new JSeparator());
final JMenuItem saveProjectMenuItem = new JMenuItem(
getMessage("project.menu.file.save_project"));
saveProjectMenuItem.setIcon(getIconResource("save.gif"));
saveProjectMenuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_S, Toolkit.getDefaultToolkit()
.getMenuShortcutKeyMask()));
saveProjectMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
if (project.getProjectFile() != null) {
project.saveProject(project.getProjectFile());
FrinikaConfig.setLastProjectFilename(project
.getProjectFile().getAbsolutePath());
} else {
withRef=false;
openSaveProjectDialog();
}
} catch (Exception ex) {
error("Error while saving", ex); // show error message,
// user should know that
// saving went wrong
ex.printStackTrace();
}
}
});
fileMenu.add(saveProjectMenuItem);
final JMenuItem saveProjectAsMenuItem = new JMenuItem(
getMessage("project.menu.file.save_project_as"));
saveProjectAsMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
withRef=false;
openSaveProjectDialog();
}
});
fileMenu.add(saveProjectAsMenuItem);
//------------
final JMenuItem saveProjectMenuItemWithRef = new JMenuItem(
getMessage("project.menu.file.save_project_with_ref"));
saveProjectMenuItemWithRef.setIcon(getIconResource("save.gif"));
// saveProjectMenuItem.setAccelerator(KeyStroke.getKeyStroke(
//KeyEvent.VK_S, Toolkit.getDefaultToolkit()
// .getMenuShortcutKeyMask()));
saveProjectMenuItemWithRef.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
if (project.getProjectFile() != null) {
project.saveProject(project.getProjectFile());
FrinikaConfig.setLastProjectFilename(project
.getProjectFile().getAbsolutePath());
} else {
withRef=true;
openSaveProjectDialog();
}
} catch (Exception ex) {
error("Error while saving", ex); // show error message,
// user should know that
// saving went wrong
ex.printStackTrace();
}
}
});
fileMenu.add(saveProjectMenuItemWithRef);
final JMenuItem saveProjectAsMenuItemWithRef = new JMenuItem(
getMessage("project.menu.file.save_project_as_with_ref"));
saveProjectAsMenuItemWithRef.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
withRef=true;
openSaveProjectDialog();
}
});
fileMenu.add(saveProjectAsMenuItemWithRef);
//------------
fileMenu.addSeparator();
final JMenuItem importMidiMenuItem = new JMenuItem(
getMessage("project.menu.file.import_midi"));
importMidiMenuItem.setIcon(getIconResource("import.gif"));
importMidiMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
JFileChooser chooser = new JFileChooser();
chooser
.setDialogTitle(getMessage("project.menu.file.import_midi"));
chooser.setFileFilter(new MidiFileFilter());
if (midiFile != null)
chooser.setSelectedFile(midiFile);
if (chooser.showOpenDialog(ProjectFrame.this) == JFileChooser.APPROVE_OPTION) {
File newMidiFile = chooser.getSelectedFile();
MidiDevice mididdevice = selectMidiDevice();
ProjectFrame frame = new ProjectFrame(
new ProjectContainer(MidiSystem
.getSequence(newMidiFile), mididdevice));
midiFile = newMidiFile;
}
;
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
fileMenu.add(importMidiMenuItem);
JMenuItem item = new JMenuItem("Import Module...");
item.setIcon(getIconResource("import.gif"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MODImporter.load(ProjectFrame.this);
}
});
fileMenu.add(item);
final JMenuItem exportMidiMenuItem = new JMenuItem(
getMessage("project.menu.file.export_midi"));
exportMidiMenuItem.setIcon(getIconResource("export.gif"));
exportMidiMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
JFileChooser chooser = new JFileChooser();
chooser
.setDialogTitle(getMessage("project.menu.file.export_midi"));
chooser.setFileFilter(new MidiFileFilter());
chooser.setSelectedFile(midiFile);
if (chooser.showSaveDialog(ProjectFrame.this) == JFileChooser.APPROVE_OPTION) {
if (chooser.getFileFilter() instanceof MidiFileFilter)
if (!chooser.getFileFilter().accept(
chooser.getSelectedFile()))
chooser.setSelectedFile(new File(chooser
.getSelectedFile().getPath()
+ ".mid"));
File newMidiFile = chooser.getSelectedFile();
MidiSystem.write(project.getSequence().export(), 1,
newMidiFile);
midiFile = newMidiFile;
}
;
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
fileMenu.addSeparator();
fileMenu.add(exportMidiMenuItem);
final JMenuItem exportWavMenuItem = new JMenuItem(
getMessage("project.menu.file.export_wav"));
exportWavMenuItem.setIcon(getIconResource("export.gif"));
exportWavMenuItem.addActionListener(new ActionListener() {
class AudioFileFilter extends FileFilter {
javax.sound.sampled.AudioFileFormat.Type type;
AudioFileFilter(javax.sound.sampled.AudioFileFormat.Type type) {
this.type = type;
}
public boolean accept(File f) {
if (f.isDirectory())
return true;
return f.getName().toLowerCase().endsWith(
"." + type.getExtension().toLowerCase());
}
public String getDescription() {
return type.toString() + " (*." + type.getExtension() + ")";
}
public javax.sound.sampled.AudioFileFormat.Type getType() {
return type;
}
}
public void actionPerformed(ActionEvent e) {
try {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Export Audio");
byte[] data = new byte[16];
AudioFormat format = new AudioFormat(
(float) FrinikaConfig.sampleRate, 16, 2, true, true);
AudioInputStream ais = new AudioInputStream(
new ByteArrayInputStream(data), format, 4);
;
javax.sound.sampled.AudioFileFormat.Type[] types = AudioSystem.getAudioFileTypes(ais);
AudioFileFilter[] filters = new AudioFileFilter[types.length];
for (int i = 0; i < types.length; i++)
filters[i] = new AudioFileFilter(types[i]);
for (int i = 0; i < filters.length; i++)
chooser.setFileFilter(filters[i]);
for (int i = 0; i < filters.length; i++)
if (filters[i].getType().getExtension().toUpperCase()
.equals("WAV"))
chooser.setFileFilter(filters[i]);
/*
* chooser .setFileFilter(new MyFileFilter(".wav", "Wav
* files"));
*/
if (chooser.showSaveDialog(ProjectFrame.this) == JFileChooser.APPROVE_OPTION) {
if (chooser.getFileFilter() instanceof AudioFileFilter)
if (!chooser.getFileFilter().accept(
chooser.getSelectedFile()))
chooser.setSelectedFile(new File(chooser
.getSelectedFile().getPath()
+ "."
+ ((AudioFileFilter) chooser
.getFileFilter()).getType()
.getExtension().toLowerCase()));
FrinikaSequencer sequencer = project.getSequencer();
long startTick = sequencer.getLoopStartPoint();
long endTick = sequencer.getLoopEndPoint();
javax.sound.sampled.AudioFileFormat.Type type = ((AudioFileFilter) chooser.getFileFilter())
.getType();
new ExportWavDialog(ProjectFrame.this, project, type,
chooser.getSelectedFile(), startTick, endTick);
project.getSequencer().stop();
}
;
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
fileMenu.add(exportWavMenuItem);
/*
* final JMenuItem exportWavPerTrackMenuItem = new JMenuItem( "Export
* wav per track"); exportWavPerTrackMenuItem.addActionListener(new
* ActionListener() {
*
* public void actionPerformed(ActionEvent e) { try { JFileChooser
* chooser = new JFileChooser();
* chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser
* .setDialogTitle("Export wav per track - select directory"); if
* (chooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { //
* Mute all synths for (int n = 0; n < synth.getNumberOfSynths(); n++) {
* Synth currentSynth = synth.getSynth(n); if (currentSynth != null) {
* currentSynth.setMute(true); } } // Export one wavfile per synth for
* (int n = 0; n < synth.getNumberOfSynths(); n++) { Synth currentSynth =
* synth.getSynth(n); if (currentSynth != null) {
* currentSynth.setMute(false); String fileName = n + "_" +
* currentSynth.getInstrumentName() + ".wav"; File file = new
* File(chooser.getSelectedFile(), fileName); new ExportWavDialog(
* frame, sequencer, voiceServer, file, sectionPanel.getSectionStart()
* mySeq.getResolution(), (sectionPanel.getSectionStart() + sectionPanel
* .getSectionLength()) mySeq.getResolution()); sequencer.stop();
* currentSynth.setMute(true); } } // UnMute all synths for (int n = 0;
* n < synth.getNumberOfSynths(); n++) { Synth currentSynth =
* synth.getSynth(n); if (currentSynth != null) {
* currentSynth.setMute(false); } } } ; } catch (Exception ex) {
* ex.printStackTrace(); } } });
*
* fileMenu.add(exportWavPerTrackMenuItem);
*
*/
if (!FrinikaMain.isMac()) {
fileMenu.addSeparator();
final JMenuItem quitMenuItem = new JMenuItem(getMessage("quit"));
quitMenuItem.setMnemonic(KeyEvent.VK_Q);
quitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
quitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tryQuit();
}
});
fileMenu.add(quitMenuItem);
}
return fileMenu;
}
JMenu debugMenu() {
JMenu debugMenu = new JMenu("debug"); // new
JMenuItem item = new JMenuItem(new DisplayStructureAction(this));
debugMenu.add(item);
item = new JMenuItem("Buffered Playback");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
BufferedPlayback bp = new BufferedPlayback(ProjectFrame.this,
getProjectContainer());
bp.start();
}
});
debugMenu.add(item);
item = new JMenuItem(new MidiIMonitorAction());
debugMenu.add(item);
//
// item = new JMenuItem(new SynthRenderAction(this));
// debugMenu.add(item);
// This is how you get rid of the 1.6 stuff !!!
// deprecated ?
if (false) {
ClassLoader loader = ClassLoader.getSystemClassLoader();
try {
Class clazz = loader.loadClass("uk.co.simphoney.music.Plug");
Class params[] = { ProjectFrame.class };
Constructor plug = clazz.getConstructor(params);
Object args[] = { this };
plug.newInstance(args);
// debugMenu.add(x); // new SimphoneyMenu(project));
} catch (ClassNotFoundException e1) {
System.out
.println(" info: Unable to load Simphoney Menus. Your probably using java < 1.6 ?");
// TODO Auto-generated catch block
// e1.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
item = new JMenuItem("ConfigListener");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ConfigListener l = new ConfigListener() {
public void configurationChanged(ChangeEvent event) {
FrinikaConfig.Meta meta = (FrinikaConfig.Meta) event
.getSource();
try {
System.out.println("configuration changed: "
+ meta.getField().getName() + "="
+ meta.getField().get(null));
} catch (IllegalAccessException iae) {
iae.printStackTrace();
}
}
};
FrinikaConfig.addConfigListener(l); // once added, will continue
// displaying all changes in
// config
}
});
debugMenu.add(item);
return debugMenu;
}
JMenu renderMenu() {
JMenu menu = new JMenu(getMessage("project.menu.render"));
menu.setMnemonic(KeyEvent.VK_R);
JMenuItem item = new JMenuItem("Render Selected Timeline");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (project.getSequencer().isRunning()) {
project.getSequencer().stop();
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
if (project.getSequencer().getLoopStartPoint() == project
.getSequencer().getLoopEndPoint()) {
JOptionPane.showMessageDialog(ProjectFrame.this,
"Please select timeline using loop markers!",
"Render Selected Timeline",
JOptionPane.WARNING_MESSAGE);
return;
}
project.getRenderer().render(ProjectFrame.this,
project.getSequencer().getLoopStartPoint(),
project.getSequencer().getLoopEndPoint());
}
});
menu.add(item);
item = new JMenuItem("Rerender Selected Timeline");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (project.getSequencer().isRunning()) {
project.getSequencer().stop();
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
if (project.getSequencer().getLoopStartPoint() == project
.getSequencer().getLoopEndPoint()) {
JOptionPane.showMessageDialog(ProjectFrame.this,
"Please select timeline using loop markers!",
"Rerender Selected Timeline",
JOptionPane.WARNING_MESSAGE);
return;
}
project.getRenderer().rerender(ProjectFrame.this,
project.getSequencer().getLoopStartPoint(),
project.getSequencer().getLoopEndPoint());
}
});
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Clear Render Cache");
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (project.getSequencer().isRunning()) {
project.getSequencer().stop();
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
project.getRenderer().purgeRenderCache();
}
});
menu.add(item);
menu.addSeparator();
final JCheckBoxMenuItem item_supress_realtime = new JCheckBoxMenuItem(
"Suppress RealTime Devices while playing");
item_supress_realtime.setSelected(true);
item_supress_realtime.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
project.getRenderer().setSupressRealTime(
item_supress_realtime.isSelected());
}
});
menu.add(item_supress_realtime);
return menu;
}
private ActionListener addMidiDevices_listener = null;
private MidiDevice addMidiDevices_selected = null;
private Icon addMidiDevices_selected_icon = null;
public void addMidiDevices(JComponent menu, List<MidiDevice.Info> infos,
List<Icon> icons) {
Iterator<Icon> icon_iterator = icons.iterator();
for (MidiDevice.Info info : infos) {
JMenuItem item = new JMenuItem(info.toString());
item.setIcon(icon_iterator.next());
final Icon icon = item.getIcon();
final MidiDevice.Info f_info = info;
item.addActionListener(new ActionListener() {
MidiDevice.Info m_info = f_info;
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
MidiDevice midiDevice = null;
try {
midiDevice = MidiSystem.getMidiDevice(m_info);
if (addMidiDevices_listener != null) {
addMidiDevices_selected = midiDevice;
addMidiDevices_selected_icon = icon;
addMidiDevices_listener.actionPerformed(null);
return;
}
midiDevice = new SynthWrapper(project, midiDevice);
} catch (Exception e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
project.getEditHistoryContainer().mark("X");
project.addMidiOutDevice(midiDevice);
project.getEditHistoryContainer()
.notifyEditHistoryListeners();
} catch (MidiUnavailableException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
midiDevicesPanel.updateDeviceTabs();
}
});
menu.add(item);
}
}
public void addMidiDevices(JComponent menu) {
List<MidiDevice.Info> infos = new ArrayList<MidiDevice.Info>();
List<Icon> icons = new ArrayList<Icon>();
List<MidiDevice.Info> infos1 = new ArrayList<MidiDevice.Info>();
List<Icon> icons1 = new ArrayList<Icon>();
List<MidiDevice.Info> infos2 = new ArrayList<MidiDevice.Info>();
List<Icon> icons2 = new ArrayList<Icon>();
for (MidiDevice.Info info : MidiSystem.getMidiDeviceInfo()) {
try {
MidiDevice dev = MidiSystem.getMidiDevice(info);
if (dev.getMaxReceivers() != 0) {
Icon icon = getMidiDeviceIcon(dev);
if (dev instanceof Synthesizer) {
infos1.add(info);
icons1.add(icon);
} else if (icon == default_midi_icon) {
infos2.add(info);
icons2.add(icon);
} else {
infos.add(info);
icons.add(icon);
}
}
} catch (Exception e) {
}
}
addMidiDevices(menu, infos1, icons1);
menu.add(new JSeparator());
addMidiDevices(menu, infos, icons);
menu.add(new JSeparator());
addMidiDevices(menu, infos2, icons2);
}
public MidiDevice selectMidiDevice() {
try {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JLabel("MIDI Out Device:"));
final JButton but = new JButton("No Device Selected");
but.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JPopupMenu popup = new JPopupMenu();
addMidiDevices(popup);
popup.show(but, 0, 0);
}
});
addMidiDevices_selected = null;
addMidiDevices_listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
but.setText(addMidiDevices_selected.getDeviceInfo()
.getName());
but.setIcon(addMidiDevices_selected_icon);
}
};
panel.add(but);
int opt = JOptionPane.showConfirmDialog(this, panel,
"Select MIDI Output", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
addMidiDevices_listener = null;
if (opt == JOptionPane.OK_OPTION)
return addMidiDevices_selected;
} finally {
addMidiDevices_listener = null;
}
return null;
}
JMenu newDeviceMenu() {
final JMenu newDeviceMenu = new JMenu(getMessage("newdevice.menu"));
newDeviceMenu.addMenuListener(new MenuListener() {
public void menuSelected(MenuEvent e) {
// System. out.println("mem_sel");
newDeviceMenu.removeAll();
addMidiDevices(newDeviceMenu);
}
public void menuDeselected(MenuEvent e) {
}
public void menuCanceled(MenuEvent e) {
}
});
return newDeviceMenu;
}
JMenu editMenu() {
JMenu editMenu = new CutPasteMenu(project); // new
// MultiEventEditMenu(project);
editMenu.add(new JSeparator());
JMenuItem item = new JMenuItem(new CreateMidiLaneAction(this));
item.setIcon(getIconResource("new_track_midi.gif"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
editMenu.add(item);
item = new JMenuItem(new CreateMidiDrumLaneAction(this));
item.setIcon(getIconResource("new_track_midi_drum.gif"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
editMenu.add(item);
item = new JMenuItem(new CreateAudioLaneAction(this));
item.setIcon(getIconResource("new_track_audio.gif"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
editMenu.add(item);
// item = new JMenuItem(new CreateXAudioLaneAction(this));
// item.setIcon(getIconResource("new_track_audio.gif"));
// item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit
// .getDefaultToolkit().getMenuShortcutKeyMask()
// | KeyEvent.SHIFT_MASK));
// editMenu.add(item);
item = new JMenuItem(new CreateTextLaneAction(this)); // Jens
item.setIcon(getIconResource("new_track_text.gif"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
editMenu.add(item);
editMenu.addSeparator();
editMenu.add(newDeviceMenu());
item = new JMenuItem(new CreateMidiLaneAction(this));
item.setIcon(getIconResource("new_track_midi.gif"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
newLaneMenu.add(item);
item = new JMenuItem(new CreateMidiDrumLaneAction(this));
item.setIcon(getIconResource("new_track_midi_drum.gif"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
newLaneMenu.add(item);
item = new JMenuItem(new CreateAudioLaneAction(this));
item.setIcon(getIconResource("new_track_audio.gif"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
newLaneMenu.add(item);
item = new JMenuItem(new CreateTextLaneAction(this)); // Jens
item.setIcon(getIconResource("new_track_text.gif"));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
newLaneMenu.add(item);
newLaneMenu.addSeparator();
newLaneMenu.add(newDeviceMenu());
editMenu.addSeparator();
final JMenuItem bounceToLane = new JMenuItem(
getMessage("project.menu.file.bounce_to_lane"));
bounceToLane.setIcon(getIconResource("new_track_audio.gif"));
bounceToLane.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Lane lane = project.getLaneSelection().getFocus();
project.getEditHistoryContainer().mark(
getMessage("sequencer.audiolane.record"));
if (lane == null || !(lane instanceof AudioLane)) {
lane = project.createAudioLane();
}
File file = ((AudioLane) lane).newFilename();
FrinikaSequencer sequencer = project.getSequencer();
long startTick = sequencer.getLoopStartPoint();
long endTick = sequencer.getLoopEndPoint();
new BounceToLane(ProjectFrame.this, project, file, startTick,
endTick, (AudioLane) lane);
project.getSequencer().stop();
}
});
editMenu.add(bounceToLane);
item = new JMenuItem(new ImportAudioAction(this));
item.setIcon(getIconResource("import.gif"));
editMenu.add(item);
item = new JMenuItem(new ImportMidiToLaneAction(this));
item.setIcon(getIconResource("import.gif"));
editMenu.add(item);
// editMenu.add(item);
// item = new JMenuItem(new ImportAudioAction(this));
// item = new JMenuItem(new DeleteLaneAction(this));
// editMenu.add(item);
// item = new JMenuItem(new SplitLaneAction(this));
// editMenu.add(item);
editMenu.add(new JSeparator());
item = new JMenuItem(new RepeatAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_R);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0));
editMenu.add(item);
/*
* item = new JMenuItem(new RepeatAction(this));
* //item.setText(item.getText()+"..."); // hack
* item.setMnemonic(KeyEvent.VK_R);
* item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0));
* midiPartMenu.add(item);
*/
editMenu.add(new JMenuItem(new SplitSelectedPartsAction(this)));
// midiPartMenu.add(new JMenuItem(new SplitSelectedPartsAction(this)));
// editMenu.add(new JSeparator());
// editMenu.add(new JMenuItem(new ImportAudioAction(this)));
// editMenu.add(new JMenuItem(new AudioPartToMidiAction(this)));
// audioPartMenu.add(new JMenuItem(new AudioPartToMidiAction(this)));
// audioPartMenu.add(new JMenuItem(new AudioAnalysisAction(this)));
editMenu.add(new JSeparator());
editMenu.add(new TimeSignatureEditAction(this));
editMenu.add(new TempoListEditAction(this));
return editMenu;
}
// ------------------------------------ Settings menu
// ------------------------------------
JMenu settingsMenu() {
JMenu settingsMenu = new JMenu(getMessage("project.menu.settings"));
settingsMenu.setMnemonic(KeyEvent.VK_S);
/*
* try { settingsMenu.add(new MidiSetupMenuItem(this)); } catch
* (MidiUnavailableException e1) { // TODO Auto-generated catch block
* e1.printStackTrace(); }
*/
JMenuItem item;
item = new JMenuItem(new MidiInSetupAction());
item.setIcon(getIconResource("midi.png"));
settingsMenu.add(item);
/*
* item=new JMenuItem(new AudioInSetupAction()); settingsMenu.add(item);
*/
settingsMenu.addSeparator();
item = new JMenuItem(new SetAudioOutputAction(this));
settingsMenu.add(item);
item.setIcon(getIconResource("output.gif"));
// boolean dm = FrinikaConfig.getDirectMonitoring();
item = new CheckBoxMenuItemConfig(
getMessage("project.menu.settings.direct_monitoring"),
FrinikaConfig._DIRECT_MONITORING);
/*
* item.addActionListener(new ActionListener() { public void
* actionPerformed(ActionEvent e) {
* FrinikaConfig.setDirectMonitoring(((JCheckBoxMenuItem) e
* .getSource()).isSelected()); } });
*/
settingsMenu.add(item);
// String multiS=FrinikaConfig.getProperty("multiplexed_audio");
// boolean ma=false;
// if (multiS != null) {
// ma=Boolean.parseBoolean(multiS);
// }
item = new CheckBoxMenuItemConfig(
getMessage("project.menu.settings.multiplexed_audio"),
FrinikaConfig._MULTIPLEXED_AUDIO);
/*
* item.addActionListener(new ActionListener() { public void
* actionPerformed(ActionEvent e) {
* FrinikaConfig.setMultiplexedAudio(((JCheckBoxMenuItem)e.getSource()).isSelected());
* //FrinikaConfig.setProperty("multiplexed_audio",String.valueOf(((JCheckBoxMenuItem)
* e // .getSource()).isSelected())); } });
*/
settingsMenu.add(item);
item = new JMenuItem(getMessage("project.menu.settings.audio_latency"));
item.setIcon(getIconResource("output.gif"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
FrinikaAudioSystem.latencyMeasureSet();
}
});
// audioDevicesMenuItem.setMnemonic(KeyEvent.VK_A);
settingsMenu.add(item);
settingsMenu.add(item);
item = new JMenuItem(
getMessage("project.menu.settings.configure_audio_server"));
item.setIcon(getIconResource("output.gif"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
FrinikaAudioSystem.configure();
}
});
// audioDevicesMenuItem.setMnemonic(KeyEvent.VK_A);
settingsMenu.add(item);
// boolean ac = FrinikaConfig.getJackAutoconnect();
settingsMenu.addSeparator();
item = new CheckBoxMenuItemConfig(
getMessage("project.menu.settings.jack_autoconnect"),
FrinikaConfig._JACK_AUTO_CONNECT);
/*
* item.addActionListener(new ActionListener() { public void
* actionPerformed(ActionEvent e) {
* FrinikaConfig.setJackAutoconnect(((JCheckBoxMenuItem) e
* .getSource()).isSelected()); } });
*/
settingsMenu.add(item);
settingsMenu.addSeparator();
settingsMenu.add(new GuiCursorUpdateMenu(project));
settingsMenu.addSeparator();
item = new JMenuItem(getMessage("project.menu.settings.show"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
FrinikaConfig.showDialog(ProjectFrame.this);
}
});
settingsMenu.add(item);
return settingsMenu;
}
JMenu toolsMenu() {
JMenu toolsMenu = new JMenu(getMessage("project.menu.tools"));
toolsMenu.setMnemonic(KeyEvent.VK_T);
// project.getMidiSelection().addMenuItem(midiMenu);
JMenuItem item = new JMenuItem(new MidiQuantizeAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_Q);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0));
toolsMenu.add(item);
project.getMidiSelection().addMenuItem(item);
item = new JMenuItem(new MidiTransposeAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_T);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, 0));
toolsMenu.add(item);
project.getMidiSelection().addMenuItem(item);
item = new JMenuItem(new MidiVelocityAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_V);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, 0));
toolsMenu.add(item);
project.getMidiSelection().addMenuItem(item);
item = new JMenuItem(new MidiShiftAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_S);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0));
toolsMenu.add(item);
project.getMidiSelection().addMenuItem(item);
item = new JMenuItem(new MidiDurationAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_D);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0));
toolsMenu.add(item);
project.getMidiSelection().addMenuItem(item);
item = new JMenuItem(new MidiTimeStretchAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_M);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, 0));
toolsMenu.add(item);
project.getMidiSelection().addMenuItem(item);
item = new JMenuItem(new MidiReverseAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_E);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, 0));
toolsMenu.add(item);
project.getMidiSelection().addMenuItem(item);
item = new JMenuItem(new MidiInsertControllersAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_I);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, 0));
toolsMenu.add(item);
project.getMidiSelection().addMenuItem(item);
toolsMenu.addSeparator();
item = new JMenuItem(new MidiStepRecordAction(this));
item.setText(item.getText() + "..."); // hack
item.setMnemonic(KeyEvent.VK_INSERT);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0));
toolsMenu.add(item);
// project.getMidiSelection().addMenuItem(item);
toolsMenu.addSeparator();
JMenu submenu = new JMenu(getMessage("sequencer.midi.groovepattern"));
item = new JMenuItem(new GroovePatternManagerAction(this));
item.setText(item.getText() + "..."); // hack
item.setMnemonic(KeyEvent.VK_M);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0));
submenu.add(item);
item = new JMenuItem(new GroovePatternCreateFromMidiPartAction(this));
// item.setText(item.getText()+"..."); // hack
item.setMnemonic(KeyEvent.VK_C);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_MASK));
submenu.add(item);
toolsMenu.add(submenu);
toolsMenu.addSeparator();
submenu = new JMenu(
getMessage(com.frinika.sequencer.gui.menu.ScriptingAction.actionId));
com.frinika.sequencer.gui.menu.ScriptingAction sa = new com.frinika.sequencer.gui.menu.ScriptingAction(
this);
item = new JMenuItem(sa);
item.setText(item.getText() + "..."); // hack
item.setMnemonic(KeyEvent.VK_G);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0));
submenu.add(item);
sa.initDialog(submenu);
toolsMenu.add(submenu);
/*
* toolsMenu.addSeparator();
*
* item = new JMenuItem( getMessage("project.menu.settings.show"));
* item.addActionListener(new ActionListener() { public void
* actionPerformed(ActionEvent e) { SettingsDialog.showSettings(); } });
*
* toolsMenu.add(item); // alternative: item = new JMenuItem(
* getMessage("project.menu.settings.show")); item.addActionListener(new
* ActionListener() { public void actionPerformed(ActionEvent e) {
* Config.showDialog(ProjectFrame.this); } });
*
* toolsMenu.add(item);
*/
return toolsMenu;
}
JMenu helpMenu() {
// ------------------------------------ Help menu
JMenu helpMenu = new JMenu(getMessage("project.menu.help"));
helpMenu.setMnemonic(KeyEvent.VK_H);
JMenuItem aboutMenuItem = new JMenuItem(
getMessage("project.menu.help.about"));
aboutMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
About.about(ProjectFrame.this);
}
});
aboutMenuItem.setMnemonic(KeyEvent.VK_A);
helpMenu.add(aboutMenuItem);
final JCheckBoxMenuItem automaticCheckNewVersionMenuItem = new JCheckBoxMenuItem(getMessage("project.menu.help.automatickcheckfornewversion"),FrinikaConfig.getAutomaticCheckForNewVersion());
automaticCheckNewVersionMenuItem.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
FrinikaConfig.setAutomatickCheckForNewVersion(automaticCheckNewVersionMenuItem.getState());
// If previously deselected check for new version when selected
if(automaticCheckNewVersionMenuItem.getState())
AutomaticVersionCheck.checkLatestVersion(ProjectFrame.this,automaticCheckNewVersionMenuItem);
}
});
helpMenu.add(automaticCheckNewVersionMenuItem);
AutomaticVersionCheck.checkLatestVersion(ProjectFrame.this,automaticCheckNewVersionMenuItem);
return helpMenu;
}
JMenu viewMenu() {
JMenu menu = new JMenu("View");
menu.setMnemonic(KeyEvent.VK_V);
JMenuItem item = new JMenuItem(new ToggleShowVoiceViewAction(this));
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F9, Toolkit
.getDefaultToolkit().getMenuShortcutKeyMask())); // Jens
menu.add(item);
return menu;
}
JMenu connectedMenu() {
JMenu menu = new JMenu(getMessage("project.menu.connected.connected"));
menu.setMnemonic(KeyEvent.VK_C);
final JCheckBoxMenuItem item = new JCheckBoxMenuItem(getMessage("project.menu.connected.radio"));
item.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if(item.getState())
{
LocalOGGHttpRadio.startRadio(project);
}
else
{
LocalOGGHttpRadio.stopRadio();
}
}
});
menu.add(item);
return menu;
}
/**
* Create menus
*
* @return
*/
JMenuBar createMenu() {
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
menuBar.add(fileMenu());
// menuBar.add(editMenu());
menuBar.add(editMenu());
// menuBar.add(transportMenu());
if (viewport == null)
menuBar.add(viewMenu());
else
menuBar.add(perspectiveMenu());
menuBar.add(settingsMenu());
menuBar.add(toolsMenu()); // Jens
menuBar.add(renderMenu());
menuBar.add(connectedMenu());
if (!FrinikaMain.isMac())
menuBar.add(helpMenu());
menuBar.add(debugMenu());
// recording menu plugin.
Part.addPluginRightButtonMenu(new MultiPartMenuPlugin(getProjectContainer()));
return menuBar;
}
/**
* The splitpane is created here
*
* @param frameSize
* @return
*/
JSplitPane createSplit(Dimension frameSize) {
JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
split.setOneTouchExpandable(true);
// Initialize editors
pianoControllerPane = new PianoControllerSplitPane(this);
TrackerPanel trackerPanel = new TrackerPanel(project.getSequence(),
this);
// frameSize.height = frameSize.height*2;
frameSize.height = frameSize.height / 3;
partViewEditor = new VoicePartViewSplitPane(this, false);
partViewEditor.setPreferredSize(frameSize);
project.getPartSelection().addSelectionListener(trackerPanel);
JTabbedPane editorTabs = new JTabbedPane();
editorTabs.setPreferredSize(frameSize);
editorTabs.addTab("Piano roll", pianoControllerPane);
editorTabs.addTab("Tracker", trackerPanel);
JPanel mixer = new CompactMixerPanel(project.getMixerControls());
mixer.setMinimumSize(new Dimension(0, 0));
editorTabs.addTab(getMessage("project.maintabs.audiomixer"), mixer);
split.setTopComponent(partViewEditor);
split.setBottomComponent(editorTabs);
return split;
}
public void tryQuit() {
/**
* Close all open frames
*/
while (openProjectFrames.size() > 1) {
System.out
.println("Open project count:" + openProjectFrames.size());
ProjectFrame frame = openProjectFrames.firstElement();
if (frame == this)
frame = openProjectFrames.lastElement();
if (frame.canClose())
frame.dispose();
}
String quitMessage;
if (project.getEditHistoryContainer().hasChanges())
quitMessage = getMessage("quit.doYouReallyWantTo.unsaved");
else
quitMessage = getMessage("quit.doYouReallyWantTo");
if (JOptionPane.showOptionDialog(this, quitMessage,
getMessage("quit.really"), JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null) == 0) {
MidiInDeviceManager.close(); // VERY IMPORTANT! Make sure all
// midi-in devices are closed for
// system.exit!
FrinikaConfig.storeAndQuit();
}
}
private boolean canClose() {
if (project.getEditHistoryContainer().hasChanges()) {
if (JOptionPane.showOptionDialog(this,
getMessage("close.unsavedChanges"),
getMessage("close.unsavedChanges.dialogTitle"),
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
null, null, null) == 0)
return true;
else
return false;
} else
return true;
}
@Override
public void dispose() {
project.close();
openProjectFrames.remove(this);
super.dispose();
}
public ProjectContainer getProjectContainer() {
return project;
}
/**
*
* @param string
* @deprecated
*/
public void infoMessage(String string) {
message(string);
}
MidiDevicesPanel midiDevicesPanel;
public MidiDevicesPanel getMidiDevicesPanel() {
return midiDevicesPanel;
}
public VoicePartViewSplitPane getVoicePartViewSplitPane() {
// TODO Auto-generated method stub
return partViewEditor;
}
public static void midiInDeviceChange() {
System.out.println("MIDIIN CHANGER");
MidiInDeviceManager.reset(FrinikaConfig.getMidiInDeviceList());
}
public void setStatusBarMessage(String msg) {
statusBar.setMessage(msg);
}
public void message(String msg, int type) { // Jens
JOptionPane.showMessageDialog(this, msg, "Frinika Message", type);
}
public void message(String msg) { // Jens
message(msg, JOptionPane.INFORMATION_MESSAGE);
}
public void error(String msg) { // Jens
message(msg, JOptionPane.ERROR_MESSAGE);
}
public void error(String msg, Throwable t) { // Jens
t.printStackTrace();
error(msg + " - " + t.getMessage());
}
public void error(Throwable t) { // Jens
error(t.getClass().getName(), t);
}
public boolean confirm(String msg) { // Jens
int result = JOptionPane.showConfirmDialog(this, msg,
"Frinika Question", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
return (result == JOptionPane.OK_OPTION);
}
public String prompt(String msg, String initialValue) { // Jens
if (initialValue == null)
initialValue = "";
String result = JOptionPane.showInputDialog(this, msg, initialValue);
return result;
}
public String prompt(String msg) { // Jens
return prompt(msg, null);
}
public String promptFile(String defaultFilename, String[][] suffices,
boolean saveMode, boolean directoryMode) { // Jens
JFileChooser fc = new JFileChooser();
if (!directoryMode) {
final boolean save = saveMode;
// final String[][] suff = suffices;
if (suffices != null) {
for (int i = 0; i < suffices.length; i++) {
final String suffix = suffices[i][0];
final String description = suffices[i][1];
// if (suffix == null) suffix = "*";
// if (description == null) description = "";
FileFilter ff = new FileFilter() {
public boolean accept(File file) {
if (file.isDirectory())
return true;
String name = file.getName();
return suffix.equals("*")
|| name.endsWith("." + suffix)
|| (save && fileDoesntExistAndDoesntEndWithAnySuffix(file));
}
public String getDescription() {
return "." + suffix + " - " + description;
}
};
fc.addChoosableFileFilter(ff);
}
}
} else { // directory mode
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
}
int r;
if (defaultFilename != null) {
File file = new File(defaultFilename);
fc.setSelectedFile(file);
}
if (saveMode) {
r = fc.showSaveDialog(this);
} else {
r = fc.showOpenDialog(this);
}
if (r == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
String name = file.getName();
String extraSuffix = "";
if (name.indexOf('.') == -1) { // no suffix entered
if (suffices != null && suffices.length > 0) {
extraSuffix = "." + suffices[0][0]; // use first one as
// default
}
}
String filename = file.getAbsolutePath() + extraSuffix;
if (saveMode) {
File fl = new File(filename);
if (fl.exists()) {
if (!confirm("File " + filename
+ " already exists. Overwrite?")) {
return null;
}
}
}
return filename;
} else {
return null;
}
}
public String promptFile(String defaultFilename, String[][] suffices,
boolean saveMode) {
return promptFile(defaultFilename, suffices, saveMode, false);
}
public String promptFile(String defaultFilename, String[][] suffices) {
return promptFile(defaultFilename, suffices, false);
}
private static boolean fileDoesntExistAndDoesntEndWithAnySuffix(File file) {
if (file.exists())
return false;
String name = file.getName();
return (name.indexOf('.') == -1);
}
/**
* Opens the save-project dialog
*
*/
void openSaveProjectDialog() {
try {
ProjectFileFilter no_compression = new ProjectFileFilter();
ProjectFileFilter zip_compressed = new ProjectFileFilter() {
public String getDescription() {
return "Frinika project (ZIP Compressed)";
}
};
ProjectFileFilter lzma_compressed = new ProjectFileFilter() {
public String getDescription() {
return "Frinika project (LZMA Compressed)";
}
};
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Save Frinika project");
chooser.setFileFilter(no_compression);
chooser.setFileFilter(zip_compressed);
chooser.setFileFilter(lzma_compressed);
chooser.setFileFilter(no_compression);
chooser.setSelectedFile(project.getProjectFile());
if (chooser.showSaveDialog(ProjectFrame.this) == JFileChooser.APPROVE_OPTION) {
File newProject = chooser.getSelectedFile();
if (chooser.getFileFilter() instanceof ProjectFileFilter)
if (!chooser.getFileFilter().accept(newProject))
newProject = new File(newProject.getPath() + ".frinika");
// int saveOption = JOptionPane
// .showOptionDialog(
// ProjectFrame.this,
// getMessage("project.save.include_referenced_data"),
// getMessage("project.save.include_referenced_data.title"),
// JOptionPane.YES_NO_OPTION,
// JOptionPane.QUESTION_MESSAGE, null, null, null);
// if (saveOption == 1)
// project.setSaveReferencedData(false);
// else if (saveOption == 0)
// project.setSaveReferencedData(true);
project.setSaveReferencedData(withRef);
if (chooser.getFileFilter() == lzma_compressed)
project.compression_level = 2;
else if (chooser.getFileFilter() == zip_compressed)
project.compression_level = 1;
else
project.compression_level = 0;
project.saveProject(newProject);
FrinikaConfig.setLastProjectFilename(newProject
.getAbsolutePath());
setTitle(newProject.getName());
}
} catch (Exception ex) {
error("Error while saving", ex); // show error message, user
// should know that saving went
// wrong
ex.printStackTrace();
}
}
public void showRightButtonPartPopup(Component invoker, int x, int y) {
// System.out.println(" RIGHT BUTTON PRESS ");
Part part = project.getPartSelection().getFocus();
if (part == null)
return;
if (part.showRightButtonMenu(invoker, x, y))
return;
part.showContextMenu(this, invoker, x, y);
/*
* // TODO put these into the parts ! (done, see
* Part.initContextMenu(..) (Jens)) if (part instanceof AudioPart ) {
* audioPartMenu.show(invoker,x,y); } else if(part instanceof MidiPart ) {
* midiPartMenu.show(invoker,x,y); }
*/
}
public static void addProjectFocusListener(ProjectFocusListener l) {
projectFocusListeners.add(l);
}
public static void removeProjectFocusListener(ProjectFocusListener l) {
projectFocusListeners.remove(l);
}
public static void notifyProjectFocusListeners() {
for (ProjectFocusListener l : projectFocusListeners)
l.projectFocusNotify(focusFrame.getProjectContainer());
}
public static void staticMessage(ProjectContainer container, String string) {
for (ProjectFrame f : openProjectFrames) {
if (f.project == container) {
f.message(string);
return;
}
}
}
static public List<ProjectFrame> getOpenProjectFrames() {
return Collections.unmodifiableList(openProjectFrames);
}
/**
* CheckBoxMenuItem which is directly bound to a boolean config value.
*
* @author Jens Gulden
*/
static class CheckBoxMenuItemConfig extends JCheckBoxMenuItem implements
ActionListener, ConfigListener {
private FrinikaConfig.Meta configOption;
public CheckBoxMenuItemConfig(String text,
FrinikaConfig.Meta configOption) {
super(text);
this.configOption = configOption;
if ((configOption.getType() == boolean.class)
|| (configOption.getType() == Boolean.class)) {
refresh();
} else {
throw new ConfigError(
"cannot bind checkbox-menu-item to option '"
+ configOption.getName()
+ "' which is of type "
+ configOption.getType().getName());
}
this.addActionListener(this);
FrinikaConfig.addConfigListener(this);
}
// @Override
public void actionPerformed(ActionEvent e) {
update();
}
// @Override
public void configurationChanged(ChangeEvent e) {
if (e.getSource() == configOption) {
refresh();
}
}
private void refresh() {
boolean b = Boolean.valueOf(configOption.get().toString());
this.setSelected(b);
}
private void update() {
boolean b = this.isSelected();
configOption.set(b);
}
}
}