import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToggleButton;
-import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import camidion.chordhelper.ChordHelperApplet;
/**
* MIDIイベント入力ダイアログ(イベント入力とイベント送出で共用)
*/
- public MidiEventDialog eventDialog;
+ private MidiEventDialog eventDialog;
/**
* 操作音を鳴らすMIDI出力デバイス
*/
private VirtualMidiDevice outputMidiDevice;
/**
+ * イベント選択リスナー
+ */
+ private ListSelectionListener selectionListener;
+ /**
* 新しいイベントリストテーブルを構築します。
* <p>データモデルとして一つのトラックのイベントリストを指定できます。
* トラックを切り替えたいときは {@link #setModel(TableModel)}
super(model, null, model.getSelectionModel());
this.outputMidiDevice = outputMidiDevice;
this.eventDialog = eventDialog;
+ titleLabel = new TitleLabel();
+ Arrays.stream(TrackEventListTableModel.Column.values()).forEach(c->
+ getColumnModel().getColumn(c.ordinal()).setPreferredWidth(c.preferredWidth)
+ );
pairNoteOnOffModel = new JToggleButton.ToggleButtonModel() {
{
addItemListener(e->eventDialog.midiMessageForm.durationForm.setEnabled(isSelected()));
setSelected(true);
}
};
- //
- // 列モデルにセルエディタを設定
eventCellEditor = new MidiEventCellEditor();
setAutoCreateColumnsFromModel(false);
- //
- eventSelectionListener = new EventSelectionListener();
- titleLabel = new TitleLabel();
- //
- TableColumnModel cm = getColumnModel();
- Arrays.stream(TrackEventListTableModel.Column.values()).forEach(c->
- cm.getColumn(c.ordinal()).setPreferredWidth(c.preferredWidth)
- );
+ selectionModel.addListSelectionListener(selectionListener = event->{
+ if( event.getValueIsAdjusting() ) return;
+ if( selectionModel.isSelectionEmpty() ) {
+ queryPasteEventAction.setEnabled(false);
+ copyEventAction.setEnabled(false);
+ deleteEventAction.setEnabled(false);
+ cutEventAction.setEnabled(false);
+ }
+ else {
+ copyEventAction.setEnabled(true);
+ deleteEventAction.setEnabled(true);
+ cutEventAction.setEnabled(true);
+ int minIndex = selectionModel.getMinSelectionIndex();
+ MidiEvent midiEvent = model.getMidiEvent(minIndex);
+ if( midiEvent != null ) {
+ MidiMessage msg = midiEvent.getMessage();
+ if( msg instanceof ShortMessage ) {
+ ShortMessage sm = (ShortMessage)msg;
+ int cmd = sm.getCommand();
+ if( cmd == 0x80 || cmd == 0x90 || cmd == 0xA0 ) {
+ // ノート番号を持つ場合、音を鳴らす。
+ MidiChannel outMidiChannels[] = outputMidiDevice.getChannels();
+ int ch = sm.getChannel();
+ int note = sm.getData1();
+ int vel = sm.getData2();
+ outMidiChannels[ch].noteOn(note, vel);
+ outMidiChannels[ch].noteOff(note, vel);
+ }
+ }
+ }
+ if( pairNoteOnOffModel.isSelected() ) {
+ int maxIndex = selectionModel.getMaxSelectionIndex();
+ int partnerIndex;
+ for( int i=minIndex; i<=maxIndex; i++ ) {
+ if( ! selectionModel.isSelectedIndex(i) ) continue;
+ partnerIndex = model.getIndexOfPartnerFor(i);
+ if( partnerIndex >= 0 && ! selectionModel.isSelectedIndex(partnerIndex) )
+ selectionModel.addSelectionInterval(partnerIndex, partnerIndex);
+ }
+ }
+ }
+ });
}
/**
- * このテーブルビューが表示するデータを提供する
- * トラック(イベントリスト)データモデルを返します。
+ * このテーブルビューが表示するデータを提供するトラック(イベントリスト)データモデルを返します。
* @return トラック(イベントリスト)データモデル
*/
@Override
public TrackEventListTableModel getModel() {
return (TrackEventListTableModel) dataModel;
}
+ /**
+ * このテーブルビューが表示するデータを提供するトラック(イベントリスト)データモデルを設定します。
+ * @param model トラック(イベントリスト)データモデル
+ */
public void setModel(TrackEventListTableModel model) {
- TrackEventListTableModel oldModel = getModel();
- if( oldModel == model ) return;
+ if( dataModel == model ) return;
if( model == null ) {
- model = getModel().getParent().getParent().emptyEventListTableModel;
+ PlaylistTableModel playlist = getModel().getParent().getParent();
+ model = playlist.emptyEventListTableModel;
queryJumpEventAction.setEnabled(false);
queryAddEventAction.setEnabled(false);
queryJumpEventAction.setEnabled(true);
queryAddEventAction.setEnabled(true);
}
- oldModel.getSelectionModel().removeListSelectionListener(eventSelectionListener);
+ selectionModel.removeListSelectionListener(selectionListener);
super.setModel(model);
setSelectionModel(model.getSelectionModel());
- model.getSelectionModel().addListSelectionListener(eventSelectionListener);
+ titleLabel.updateTrackNumber(model.getParent().getSelectionModel().getMinSelectionIndex());
+ selectionModel.addListSelectionListener(selectionListener);
}
/**
* タイトルラベル
setText(text);
}
}
-
- /**
- * イベント選択リスナー
- */
- private EventSelectionListener eventSelectionListener;
- /**
- * 選択イベントの変更に反応するリスナー
- */
- private class EventSelectionListener implements ListSelectionListener {
- public EventSelectionListener() {
- getModel().getSelectionModel().addListSelectionListener(this);
- }
- @Override
- public void valueChanged(ListSelectionEvent e) {
- if( e.getValueIsAdjusting() )
- return;
- if( getSelectionModel().isSelectionEmpty() ) {
- queryPasteEventAction.setEnabled(false);
- copyEventAction.setEnabled(false);
- deleteEventAction.setEnabled(false);
- cutEventAction.setEnabled(false);
- }
- else {
- copyEventAction.setEnabled(true);
- deleteEventAction.setEnabled(true);
- cutEventAction.setEnabled(true);
- TrackEventListTableModel trackModel = getModel();
- int minIndex = getSelectionModel().getMinSelectionIndex();
- MidiEvent midiEvent = trackModel.getMidiEvent(minIndex);
- if( midiEvent != null ) {
- MidiMessage msg = midiEvent.getMessage();
- if( msg instanceof ShortMessage ) {
- ShortMessage sm = (ShortMessage)msg;
- int cmd = sm.getCommand();
- if( cmd == 0x80 || cmd == 0x90 || cmd == 0xA0 ) {
- // ノート番号を持つ場合、音を鳴らす。
- MidiChannel outMidiChannels[] = outputMidiDevice.getChannels();
- int ch = sm.getChannel();
- int note = sm.getData1();
- int vel = sm.getData2();
- outMidiChannels[ch].noteOn(note, vel);
- outMidiChannels[ch].noteOff(note, vel);
- }
- }
- }
- if( pairNoteOnOffModel.isSelected() ) {
- int maxIndex = getSelectionModel().getMaxSelectionIndex();
- int partnerIndex;
- for( int i=minIndex; i<=maxIndex; i++ ) {
- if( ! getSelectionModel().isSelectedIndex(i) ) continue;
- partnerIndex = trackModel.getIndexOfPartnerFor(i);
- if( partnerIndex >= 0 && ! getSelectionModel().isSelectedIndex(partnerIndex) )
- getSelectionModel().addSelectionInterval(partnerIndex, partnerIndex);
- }
- }
- }
- }
- }
/**
* Pair noteON/OFF トグルボタンモデル
*/
MidiEvent partnerEvent = null;
eventDialog.midiMessageForm.setMessage(
selectedMidiEvent.getMessage(),
- trackModel.getParent().charset
+ trackModel.getParent().getCharset()
);
if( eventDialog.midiMessageForm.isNote() ) {
int partnerIndex = trackModel.getIndexOfPartnerFor(selectedIndex);
long tick = tickPositionModel.getTickPosition();
MidiMessageForm form = eventDialog.midiMessageForm;
SequenceTrackListTableModel seqModel = trackModel.getParent();
- MidiMessage msg = form.getMessage(seqModel.charset);
+ MidiMessage msg = form.getMessage(seqModel.getCharset());
if( msg == null ) {
return false;
}
ChordHelperApplet.VersionInfo.NAME,
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION
- ) getModel().removeSelectedMidiEvents();
+ ) {
+ getModel().removeMidiEvents(getModel().getSelectedMidiEvents());
+ }
}
};
/**