/* * Created on February 10, 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.gui.menu.midi; import com.frinika.gui.OptionsDialog; import com.frinika.gui.OptionsEditor; import com.frinika.project.ProjectContainer; import com.frinika.project.gui.ProjectFrame; import com.frinika.sequencer.gui.ControllerSelector; import com.frinika.sequencer.gui.TimeFormat; import com.frinika.sequencer.gui.TimeSelector; import com.frinika.sequencer.model.MidiLane; import com.frinika.sequencer.model.MultiEvent; import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.Collection; import java.util.HashMap; import java.util.Map; import javax.swing.AbstractButton; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * GUI-component for setting options of a MidiInsertControllersAction. * * (Created with NetBeans 5.5 gui-editor, see corresponding .form file.) * * @see MidiInsertControllersAction * @author Jens Gulden */ public class MidiInsertControllersActionEditor extends JPanel implements OptionsEditor { private MidiInsertControllersAction action; private ProjectFrame frame; private TimeSelector startTimeSelector; private TimeSelector lengthTimeSelector; private TimeSelector resolutionTimeSelector; private ControllerSelector controllerSelector; private Map<AbstractButton, MidiInsertControllersAction.ControllerFunction> functionButtons; private Map<MidiInsertControllersAction.ControllerFunction, JComponent> functions; /** Creates new form MidiInsertControllersActionEditor */ public MidiInsertControllersActionEditor(ProjectFrame frame, MidiInsertControllersAction action) { super(); this.frame = frame; this.action = action; initComponents(); ProjectContainer project = frame.getProjectContainer(); startTimeSelector = new TimeSelector(project, TimeFormat.BAR_BEAT_TICK); startTimeSelectorPanel.add(startTimeSelector); lengthTimeSelector = new TimeSelector(project, TimeFormat.BEAT_TICK); lengthTimeSelectorPanel.add(lengthTimeSelector); resolutionTimeSelector = new TimeSelector(project, TimeFormat.BEAT_TICK); resolutionTimeSelectorPanel.add(resolutionTimeSelector); controllerSelector = new ControllerSelector(); controllerSelector.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { MidiInsertControllersActionEditor.this.action.controller = controllerSelector.getControllerType(); // must be passed directly on each change to allow Functions gui to react } }); controllerSelectorPanel.add(controllerSelector); Collection<MidiInsertControllersAction.ControllerFunction> ff = action.getAvailableControllerFunctions(); functions = new HashMap<MidiInsertControllersAction.ControllerFunction, JComponent>(); functionButtons = new HashMap<AbstractButton, MidiInsertControllersAction.ControllerFunction>(); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; gbc.insets.left = 3; gbc.insets.right = 3; for (MidiInsertControllersAction.ControllerFunction function : ff) { String name = function.getName(); Icon icon = function.getIcon(50, 30); JRadioButton rb = new JRadioButton(name); functionsButtonGroup.add(rb); functionButtons.put(rb, function); rb.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { JRadioButton rb = (JRadioButton)e.getSource(); if (rb.isSelected()) { MidiInsertControllersAction.ControllerFunction f = functionButtons.get(rb); JComponent gui = functions.get(f); if (gui == null) { gui = f.createGUI(); if (gui == null) { gui = new JPanel(new GridBagLayout()); gui.add(new JLabel("(this function has no options)"), new GridBagConstraints()); } functions.put(f, gui); } functionOptionsPanel.removeAll(); functionOptionsPanel.add(gui); Container parent = MidiInsertControllersActionEditor.this.getParent(); if (parent != null) { functionOptionsPanel.validate(); ((OptionsDialog)parent.getParent().getParent().getParent().getParent().getParent()).validate(); // hack, obviously functionOptionsPanel.repaint(); } } } }); functionsPanel.add(rb, gbc); JLabel label; if ( icon != null) { label = new JLabel(icon); } else { label = new JLabel(name); } functionsPanel.add(label, gbc); functionsPanel.add(new JPanel(), gbc); // spacer } functionsButtonGroup.getElements().nextElement().setSelected(true); // first one by default } public void refresh() { long start = frame.getProjectContainer().getSequencer().getTickPosition(); startTimeSelector.setTicks(start); lengthTimeSelector.setTicks(action.length); resolutionTimeSelector.setTicks(action.resolution); MidiInsertControllersAction.ControllerFunction f = action.function; for (AbstractButton radiobutton : functionButtons.keySet()) { MidiInsertControllersAction.ControllerFunction ff = functionButtons.get(radiobutton); if (ff == f) { radiobutton.setSelected(true); } } MultiEvent first = action.events.iterator().next(); controllerSelector.setControllerList(((MidiLane)first.getMidiPart().getLane()).getControllerList()); controllerSelector.setControllerType(action.controller); controllerSelector.addPseudoController("(Note)", -1); } public void update() { action.start = startTimeSelector.getTicks(); action.length = lengthTimeSelector.getTicks(); action.resolution = resolutionTimeSelector.getTicks(); action.controller = controllerSelector.getControllerType(); for (AbstractButton radiobutton : functionButtons.keySet()) { if (radiobutton.isSelected()) { action.function = functionButtons.get( radiobutton ); } } } /** 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; functionsButtonGroup = new javax.swing.ButtonGroup(); headPanel = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); startTimeSelectorPanel = new javax.swing.JPanel(); jLabel2 = new javax.swing.JLabel(); lengthTimeSelectorPanel = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); controllerSelectorPanel = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); resolutionTimeSelectorPanel = new javax.swing.JPanel(); functionsPanel = new javax.swing.JPanel(); functionOptionsPanel = new javax.swing.JPanel(); setLayout(new java.awt.GridBagLayout()); headPanel.setLayout(new java.awt.GridBagLayout()); jLabel1.setText("Insert at"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 3, 5, 3); headPanel.add(jLabel1, gridBagConstraints); startTimeSelectorPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 3, 5, 3); headPanel.add(startTimeSelectorPanel, gridBagConstraints); jLabel2.setText("Length"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 3, 5, 3); headPanel.add(jLabel2, gridBagConstraints); lengthTimeSelectorPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 3, 5, 3); headPanel.add(lengthTimeSelectorPanel, gridBagConstraints); jLabel4.setText("Controller"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 3, 5, 3); headPanel.add(jLabel4, gridBagConstraints); controllerSelectorPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 3, 5, 3); headPanel.add(controllerSelectorPanel, gridBagConstraints); jLabel3.setText("at each"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 3, 5, 3); headPanel.add(jLabel3, gridBagConstraints); resolutionTimeSelectorPanel.setLayout(new java.awt.BorderLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 3, 5, 3); headPanel.add(resolutionTimeSelectorPanel, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; add(headPanel, gridBagConstraints); functionsPanel.setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(8, 3, 8, 3); add(functionsPanel, gridBagConstraints); functionOptionsPanel.setLayout(new java.awt.GridBagLayout()); functionOptionsPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3); add(functionOptionsPanel, gridBagConstraints); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel controllerSelectorPanel; private javax.swing.JPanel functionOptionsPanel; private javax.swing.ButtonGroup functionsButtonGroup; private javax.swing.JPanel functionsPanel; private javax.swing.JPanel headPanel; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JPanel lengthTimeSelectorPanel; private javax.swing.JPanel resolutionTimeSelectorPanel; private javax.swing.JPanel startTimeSelectorPanel; // End of variables declaration//GEN-END:variables }