/* * * Copyright (c) 2006-2007 Paul John Leonard * * http://www.frinika.com * * This file is part of Frinika. * * Frinika is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Frinika is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Frinika; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.frinika.sequencer.gui.menu; import static com.frinika.localization.CurrentLocale.getMessage; import java.awt.Component; import java.awt.event.ActionEvent; import java.util.EventObject; import javax.swing.AbstractAction; import javax.swing.AbstractCellEditor; import javax.swing.CellEditor; import javax.swing.DefaultCellEditor; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.event.CellEditorListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; import com.frinika.project.gui.ProjectFrame; import com.frinika.sequencer.gui.TimeSelector; import com.frinika.sequencer.model.tempo.TempoList; import com.frinika.sequencer.model.tempo.TempoListListener; import com.frinika.sequencer.model.util.TimeUtils; public class TempoListEditAction extends AbstractAction { /** * */ private static final long serialVersionUID = 1L; private ProjectFrame project; private TempoList list; private TimeUtils timeUtil; public TempoListEditAction(ProjectFrame project) { super(getMessage("sequencer.project.edit_tempolist"), ProjectFrame .getIconResource("tempolist.png")); this.project = project; this.list = project.getProjectContainer().getTempoList(); this.timeUtil = project.getProjectContainer().getTimeUtils(); } JFrame frame; public void actionPerformed(ActionEvent arg0) { SwingUtilities.invokeLater(new Runnable() { @SuppressWarnings("serial") public void run() { if (frame == null) { frame = new JFrame(); TableModel dataModel = new AbstractTableModel() { int tick; double bpm; TempoListListener listener = new TempoListListener() { public void notifyTempoListChange() { fireTableDataChanged(); } }; { list.addTempoListListener(listener); } public int getColumnCount() { return 3; } public int getRowCount() { list.reco(); return list.size() + 1; } public Object getValueAt(int row, int col) { if (row >= list.size()) return ""; TempoList.MyTempoEvent ev = list.elementAt(row); if (col == 0) return timeUtil.tickToBarBeatTick(ev.getTick()); else if (col == 1) return ev.getTime(); else if (col == 2) return ev.getBPM(); assert (false); return ""; } public boolean isCellEditable(int row, int col) { if (row == 0 && col == 0) return false; return col == 0 || col == 2; } public void setValueAt(Object value, int row, int col) { boolean newE = row >= list.size(); TempoList.MyTempoEvent ev = null; if (!newE) { ev = list.elementAt(row); } else { ev = list.elementAt(list.size() - 1); } tick = (int) ev.getTick(); bpm = ev.getBPM(); try { if (col == 0) { tick = (int) timeUtil .barBeatTickToTick((String) value); } else if (col == 2) { bpm = Double.parseDouble((String) value); } if (!newE) list.remove(ev.getTick(), ev.getTick() + 1); list.add(tick, bpm); list.reco(); list.notifyListeners(); } catch (Exception e) { e.printStackTrace(); } fireTableDataChanged(); } }; JTable table = new JTable(dataModel); table.getColumnModel().getColumn(0).setWidth(50); table.getColumnModel().getColumn(1).setWidth(15); table.getColumnModel().getColumn(2).setWidth(15); table.getColumnModel().getColumn(0).setHeaderValue( "Bar.Beat:Tick"); table.getColumnModel().getColumn(1).setHeaderValue("Time"); table.getColumnModel().getColumn(2).setHeaderValue("BPM"); class TimeCellEditor extends AbstractCellEditor implements TableCellEditor { TimeSelector ts = new TimeSelector(project .getProjectContainer()); public Object getCellEditorValue() { return ts.getString(); } // Implement the one method defined by TableCellEditor. public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column) { ts.setString((String) value); return ts; } } ; // nearly works but a bit messy // table.getColumnModel().getColumn(0).setCellEditor(new // TimeCellEditor()); JScrollPane scrollpane = new JScrollPane(table); frame.setContentPane(scrollpane); frame.setTitle("Tempo List"); frame.pack(); } frame.setVisible(true); } }); } }