/*
* JSampler - a java front-end for LinuxSampler
*
* Copyright (C) 2005, 2006 Grigor Kirilov Iliev
*
* This file is part of JSampler.
*
* JSampler is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* JSampler 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 JSampler; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package org.jsampler.view;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.KeyStroke;
import org.jsampler.DefaultOrchestraListModel;
import org.jsampler.OrchestraModel;
import javax.swing.table.TableCellRenderer;
import org.jsampler.event.OrchestraListEvent;
import org.jsampler.event.OrchestraListListener;
import static javax.swing.KeyStroke.*;
/**
* A table for representing orchestras.
* @author Grigor Iliev
*/
public class OrchestraTable extends JTable {
/** Creates a new instance of OrchestraTable
. */
public
OrchestraTable() {
this(new OrchestraTableModel(new DefaultOrchestraListModel()));
}
/**
* Creates a new instance of OrchestraTable
using the specified data model.
* @param dataModel The data model to be represented by this table.
*/
public
OrchestraTable(OrchestraTableModel dataModel) {
super(dataModel);
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
installKeyboardListeners();
}
private void
installKeyboardListeners() {
KeyStroke k = getKeyStroke(KeyEvent.VK_ESCAPE, 0);
getInputMap(JComponent.WHEN_FOCUSED).put(k, Actions.CLEAR_SELECTION);
getActionMap().put(Actions.CLEAR_SELECTION, new Actions(Actions.CLEAR_SELECTION));
k = getKeyStroke(KeyEvent.VK_UP, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK);
getInputMap(JComponent.WHEN_FOCUSED).put(k, Actions.MOVE_ON_TOP);
getActionMap().put(Actions.MOVE_ON_TOP, new Actions(Actions.MOVE_ON_TOP));
k = getKeyStroke(KeyEvent.VK_UP, KeyEvent.ALT_MASK);
getInputMap(JComponent.WHEN_FOCUSED).put(k, Actions.MOVE_UP);
getActionMap().put(Actions.MOVE_UP, new Actions(Actions.MOVE_UP));
k = getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.ALT_MASK);
getInputMap(JComponent.WHEN_FOCUSED).put(k, Actions.MOVE_DOWN);
getActionMap().put(Actions.MOVE_DOWN, new Actions(Actions.MOVE_DOWN));
k = getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK);
getInputMap(JComponent.WHEN_FOCUSED).put(k, Actions.MOVE_AT_BOTTOM);
getActionMap().put(Actions.MOVE_AT_BOTTOM, new Actions(Actions.MOVE_AT_BOTTOM));
}
/**
* Gets the OrchestraTableModel
that
* provides the data displayed by this OrchestraTable
.
* @return The OrchestraTableModel
that
* provides the data displayed by this OrchestraTable
.
*/
public OrchestraTableModel
getModel() { return (OrchestraTableModel) super.getModel(); }
/**
* Sets the data model for this table to dataModel
.
* @param dataModel The new data source for this table.
*/
public void
setModel(OrchestraTableModel dataModel) {
super.setModel(dataModel);
}
/**
* Gets the selected orchestra.
* @return The selected orchestra, or null
if no orchestra is selected.
*/
public OrchestraModel
getSelectedOrchestra() {
int i = getSelectedRow();
if(i == -1) return null;
return getModel().getOrchestraListModel().getOrchestra(i);
}
/**
* Selects the specified orchestra. If orchestra
is
* null
or is not in the table the current selection is cleared.
* @param orchestra The orchestra to select.
*/
public void
setSelectedOrchestra(OrchestraModel orchestra) {
int i = getModel().getOrchestraListModel().getOrchestraIndex(orchestra);
if(i < 0) {
clearSelection();
return;
}
setRowSelectionInterval(i, i);
}
/**
* Returns an appropriate renderer for the cell specified by
* row
and column
.
* @param row The row of the cell to render, where 0 is the first row.
* @param column The column of the cell to render, where 0 is the first column.
*/
public TableCellRenderer
getCellRenderer(int row, int column) {
TableCellRenderer r = super.getCellRenderer(row, column);
if(r instanceof JComponent) {
String s;
s = getModel().getOrchestraListModel().getOrchestra(row).getDescription();
if(s != null && s.length() == 0) s = null;
((JComponent)r).setToolTipText(s);
}
return r;
}
private class Actions extends AbstractAction {
private static final String CLEAR_SELECTION = "clearSelection";
private static final String MOVE_ON_TOP = "moveOrchestraOnTop";
private static final String MOVE_UP = "moveOrchestraUp";
private static final String MOVE_DOWN = "moveOrchestraDown";
private static final String MOVE_AT_BOTTOM = "moveOrchestraAtBottom";
Actions(String name) { super(name); }
public void
actionPerformed(ActionEvent e) {
String key = getValue(Action.NAME).toString();
if(key == CLEAR_SELECTION) {
clearSelection();
} else if(key == MOVE_ON_TOP) {
OrchestraModel om = getSelectedOrchestra();
getModel().getOrchestraListModel().moveOrchestraOnTop(om);
setSelectedOrchestra(om);
} else if(key == MOVE_UP) {
OrchestraModel om = getSelectedOrchestra();
getModel().getOrchestraListModel().moveOrchestraUp(om);
setSelectedOrchestra(om);
} else if(key == MOVE_DOWN) {
OrchestraModel om = getSelectedOrchestra();
getModel().getOrchestraListModel().moveOrchestraDown(om);
setSelectedOrchestra(om);
} else if(key == MOVE_AT_BOTTOM) {
OrchestraModel om = getSelectedOrchestra();
getModel().getOrchestraListModel().moveOrchestraAtBottom(om);
setSelectedOrchestra(om);
}
}
}
}