1 package camidion.chordhelper.midieditor;
3 import java.awt.event.ActionEvent;
4 import java.util.Arrays;
6 import javax.swing.AbstractAction;
7 import javax.swing.Action;
8 import javax.swing.DefaultCellEditor;
9 import javax.swing.JComboBox;
10 import javax.swing.JComponent;
11 import javax.swing.JLabel;
12 import javax.swing.JOptionPane;
13 import javax.swing.JTable;
14 import javax.swing.ListSelectionModel;
15 import javax.swing.event.ListSelectionListener;
16 import javax.swing.event.TableModelEvent;
17 import javax.swing.table.TableCellEditor;
19 import camidion.chordhelper.ChordHelperApplet;
20 import camidion.chordhelper.music.MIDISpec;
23 * シーケンス(トラックリスト)テーブルビュー
25 public class SequenceTrackListTable extends JTable {
29 Action addTrackAction = new AbstractAction("New") {
31 String tooltip = "Append new track - 新しいトラックの追加";
32 putValue(Action.SHORT_DESCRIPTION, tooltip);
36 public void actionPerformed(ActionEvent e) { getModel().createTrack(); }
41 Action deleteTrackAction = new AbstractAction("Delete", MidiSequenceEditorDialog.deleteIcon) {
42 public static final String CONFIRM_MESSAGE =
43 "Do you want to delete selected track ?\n選択したトラックを削除しますか?";
45 putValue(Action.SHORT_DESCRIPTION, "Delete selected track - 選択したトラックを削除");
49 public void actionPerformed(ActionEvent event) {
50 if( JOptionPane.showConfirmDialog(
51 ((JComponent)event.getSource()).getRootPane(),
53 ChordHelperApplet.VersionInfo.NAME,
54 JOptionPane.YES_NO_OPTION,
55 JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION
56 ) getModel().deleteSelectedTracks();
62 private ListSelectionListener trackSelectionListener;
64 * トラックリストテーブルビューを構築します。
65 * @param model シーケンス(トラックリスト)データモデル
66 * @param eventListTable イベントリストテーブル
68 public SequenceTrackListTable(SequenceTrackListTableModel model, MidiEventTable eventListTable) {
69 super(model, null, model.getSelectionModel());
71 .getColumn(SequenceTrackListTableModel.Column.RECORD_CHANNEL.ordinal())
72 .setCellEditor(new DefaultCellEditor(new JComboBox<String>(){{
74 for(int i=1; i <= MIDISpec.MAX_CHANNELS; i++) addItem(String.format("%d", i));
77 setAutoCreateColumnsFromModel(false);
78 Arrays.stream(SequenceTrackListTableModel.Column.values()).forEach(c->
79 getColumnModel().getColumn(c.ordinal()).setPreferredWidth(c.preferredWidth)
81 selectionModel.addListSelectionListener(trackSelectionListener = event->{
82 if( event.getValueIsAdjusting() ) return;
83 deleteTrackAction.setEnabled(! selectionModel.isSelectionEmpty());
84 eventListTable.setModel(getModel().getSelectedTrackModel());
88 * このテーブルビューが表示するデータを提供するシーケンス(トラックリスト)データモデルを返します。
89 * @return シーケンス(トラックリスト)データモデル
92 public SequenceTrackListTableModel getModel() {
93 return (SequenceTrackListTableModel)dataModel;
96 * このテーブルビューが表示するデータを提供するシーケンス(トラックリスト)データモデルを設定します。
97 * @param model シーケンス(トラックリスト)データモデル
99 public void setModel(SequenceTrackListTableModel model) {
100 if( dataModel == model ) return;
102 if( model == null ) {
103 model = getModel().getParent().emptyTrackListTableModel;
104 addTrackAction.setEnabled(false);
107 addTrackAction.setEnabled(true);
109 selectionModel.clearSelection();
110 selectionModel.removeListSelectionListener(trackSelectionListener);
111 super.setModel(model);
112 setSelectionModel(model.getSelectionModel());
113 titleLabel.setSelection(model.getParent().getSelectionModel());
114 selectionModel.addListSelectionListener(trackSelectionListener);
119 TitleLabel titleLabel = new TitleLabel();
123 private class TitleLabel extends JLabel {
124 private static final String TITLE = "Tracks";
125 public TitleLabel() { setText(TITLE); }
126 public void setSelection(ListSelectionModel sequenceSelectionModel) {
128 if( ! sequenceSelectionModel.isSelectionEmpty() ) {
129 int index = sequenceSelectionModel.getMinSelectionIndex();
130 if( index >= 0 ) text = String.format(text+" - MIDI file #%d", index);
138 * <p>このトラックリストテーブルのデータが変わったときに編集を解除します。
139 * 例えば、イベントが編集された場合や、シーケンサーからこのモデルが外された場合がこれに該当します。
143 public void tableChanged(TableModelEvent e) {
144 super.tableChanged(e);
148 * このトラックリストテーブルが編集モードになっていたら解除します。
150 private void cancelCellEditing() {
151 TableCellEditor currentCellEditor = getCellEditor();
152 if( currentCellEditor != null ) currentCellEditor.cancelCellEditing();