/* * Created on March 6, 2007 * * Copyright (c) 2007 Jens Gulden * * 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.sequencer.midi.groovepattern.gui; import com.frinika.gui.AbstractDialog; import com.frinika.project.gui.ProjectFrame; import com.frinika.sequencer.gui.selection.PartSelection; import com.frinika.sequencer.midi.groovepattern.GroovePatternManager; import com.frinika.sequencer.midi.groovepattern.GroovePattern; import com.frinika.sequencer.midi.groovepattern.GroovePatternFromSequence; import com.frinika.sequencer.model.MidiPart; import com.frinika.sequencer.model.Part; import java.awt.Point; import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Vector; /** * Groove patter manager dialog. * * (Created with NetBeans 5.5 gui-editor, see corresponding .form file.) * * @author Jens Gulden */ public class GroovePatternManagerDialog extends AbstractDialog { private static Map<ProjectFrame, GroovePatternManagerDialog> instances = new HashMap<ProjectFrame, GroovePatternManagerDialog>(); public static GroovePatternManagerDialog getDialog(ProjectFrame frame) { GroovePatternManagerDialog d = instances.get(frame); if (d == null) { d = new GroovePatternManagerDialog(frame, GroovePatternManager.getInstance()); instances.put(frame, d); } return d; } public static void showDialog(ProjectFrame frame) { getDialog(frame).show(); } private GroovePatternManager manager; /** Creates new form GroovePatternManagerDialog */ public GroovePatternManagerDialog(ProjectFrame parent, GroovePatternManager manager) { super(parent, "Groove Patterns", true); this.manager = manager; initComponents(); refresh(); setSize(600, 400); AbstractDialog.centerOnScreen(this); Point p = getLocation(); setLocation(p.x+100, p.y+100); // so this doesn't appear right above quantize-dialog if opened from there } @Override public void show() { refresh(); super.show(); } private void refresh() { refreshItemsList(); } private void refreshItemsList() { int index = itemsList.getSelectedIndex(); Collection<GroovePatternFromSequence> patterns = manager.getUserGroovePatterns(); //Vector<String> names = new Vector<String>(); Vector<GroovePattern> items = new Vector<GroovePattern>(); for (GroovePattern gp : patterns) { //names.add(gp.getName()); items.add(gp); } itemsList.setListData(items); if (index >= 0) { itemsList.setSelectedIndex(index); itemsList.ensureIndexIsVisible(index); } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; mainPanel = new javax.swing.JPanel(); itemsScrollPane = new javax.swing.JScrollPane(); itemsList = new javax.swing.JList(); newButton = new javax.swing.JButton(); importButton = new javax.swing.JButton(); exportButton = new javax.swing.JButton(); removeButton = new javax.swing.JButton(); editButton = new javax.swing.JButton(); closeButton = new javax.swing.JButton(); setTitle("Groove Patterns"); mainPanel.setLayout(new java.awt.GridBagLayout()); itemsList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); itemsScrollPane.setViewportView(itemsList); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; mainPanel.add(itemsScrollPane, gridBagConstraints); newButton.setMnemonic('N'); newButton.setText("New"); newButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); mainPanel.add(newButton, gridBagConstraints); importButton.setMnemonic('I'); importButton.setText("Import..."); importButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { importButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); mainPanel.add(importButton, gridBagConstraints); exportButton.setMnemonic('x'); exportButton.setText("Export..."); exportButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { exportButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); mainPanel.add(exportButton, gridBagConstraints); removeButton.setMnemonic('R'); removeButton.setText("Remove"); removeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); mainPanel.add(removeButton, gridBagConstraints); editButton.setMnemonic('E'); editButton.setText("Edit..."); editButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); mainPanel.add(editButton, gridBagConstraints); closeButton.setMnemonic('C'); closeButton.setText("Close"); closeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { closeButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); mainPanel.add(closeButton, gridBagConstraints); getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER); pack(); }// </editor-fold>//GEN-END:initComponents private void exportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportButtonActionPerformed GroovePatternFromSequence sel = (GroovePatternFromSequence)itemsList.getSelectedValue(); if (sel != null) { String filename = frame.promptFile(null, ProjectFrame.FILE_FILTER_MIDIFILES, true); if (filename != null) { File file = new File(filename); try { sel.saveAsMidiFile(file); } catch (IOException e) { frame.error(e); } } } }//GEN-LAST:event_exportButtonActionPerformed /** * * @param frame * @see com.frinika.sequencer.gui.menu.midi.GroovePatternCreateFromMidiPart */ public static void interactionImportGroovePatternFromMidiPartSelection(ProjectFrame frame) { interactionImportGroovePatternFromMidiPartSelection(frame, null); } private static void interactionImportGroovePatternFromMidiPartSelection(ProjectFrame frame, GroovePatternManagerDialog dialog) { PartSelection sel = frame.getProjectContainer().getPartSelection(); if (sel != null) { Collection<Part> c = sel.getSelected(); if (! c.isEmpty() ) { Part p = c.iterator().next(); // first if (p instanceof MidiPart) { String name = frame.prompt("Import selected Midi part as groove pattern.\nPlease enter a name for the new groove pattern:"); if (name != null) { try { GroovePattern gp = GroovePatternManager.getInstance().importUserGroovePattern(name, (MidiPart)p); if (dialog != null) { dialog.refreshItemsList(); dialog.itemsList.setSelectedValue(gp.getName(), true); } } catch (Exception e) { frame.error(e); } } return; // successful exit (or user-canceled) } } } frame.message("Please select a Midi part to import as groove pattern."); } private void newButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newButtonActionPerformed interactionImportGroovePatternFromMidiPartSelection(frame, this); }//GEN-LAST:event_newButtonActionPerformed private void importButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_importButtonActionPerformed String filename = frame.promptFile(null, ProjectFrame.FILE_FILTER_MIDIFILES); if (filename != null) { File file = new File(filename); try { GroovePattern gp = GroovePatternManager.getInstance().importUserGroovePattern(file); refreshItemsList(); itemsList.setSelectedValue(gp, true); } catch (Exception e) { frame.error(e); } } }//GEN-LAST:event_importButtonActionPerformed private void removeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeButtonActionPerformed GroovePatternFromSequence sel = (GroovePatternFromSequence)itemsList.getSelectedValue(); if (sel != null) { if (frame.confirm("Really DELETE groove pattern '"+sel.getName()+"'?")) { try { GroovePatternManager.getInstance().removeUserGroovePattern(sel); } catch (IOException ioe) { frame.error(ioe); } refreshItemsList(); itemsList.setSelectedIndex(-1); } } }//GEN-LAST:event_removeButtonActionPerformed private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed GroovePatternFromSequence sel = (GroovePatternFromSequence)itemsList.getSelectedValue(); try { sel.openAsOwnProject(); //this.toFront(); // we are modal, so user must first close this dialog to go on in newly opened project this.hide(); } catch (Exception e) { frame.error(e); } }//GEN-LAST:event_editButtonActionPerformed private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed hide(); }//GEN-LAST:event_closeButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton closeButton; private javax.swing.JButton editButton; private javax.swing.JButton exportButton; private javax.swing.JButton importButton; private javax.swing.JList itemsList; private javax.swing.JScrollPane itemsScrollPane; private javax.swing.JPanel mainPanel; private javax.swing.JButton newButton; private javax.swing.JButton removeButton; // End of variables declaration//GEN-END:variables }