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.TableModelEvent;
16 import javax.swing.table.TableCellEditor;
18 import camidion.chordhelper.ChordHelperApplet;
19 import camidion.chordhelper.music.MIDISpec;
22 * シーケンス(トラックリスト)テーブルビュー
24 public class SequenceTrackListTable extends JTable {
28 Action addTrackAction = new AbstractAction("New") {
30 String tooltip = "Append new track - 新しいトラックの追加";
31 putValue(Action.SHORT_DESCRIPTION, tooltip);
35 public void actionPerformed(ActionEvent e) {
36 int newIndex = getModel().createTrack();
37 selectionModel.setSelectionInterval(newIndex, newIndex);
43 Action deleteTrackAction = new AbstractAction("Delete", MidiSequenceEditorDialog.deleteIcon) {
44 public static final String CONFIRM_MESSAGE =
45 "Do you want to delete selected track ?\n選択したトラックを削除しますか?";
47 putValue(Action.SHORT_DESCRIPTION, "Delete selected track - 選択したトラックを削除");
51 public void actionPerformed(ActionEvent event) {
52 if( JOptionPane.showConfirmDialog(
53 ((JComponent)event.getSource()).getRootPane(),
55 ChordHelperApplet.VersionInfo.NAME,
56 JOptionPane.YES_NO_OPTION,
57 JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION
58 ) getModel().deleteSelectedTracks(selectionModel);
62 * トラックリストテーブルビューを構築します。
63 * @param model シーケンス(トラックリスト)データモデル
64 * @param eventListTable イベントリストテーブル
66 public SequenceTrackListTable(SequenceTrackListTableModel model, MidiEventTable eventListTable) {
69 .getColumn(SequenceTrackListTableModel.Column.RECORD_CHANNEL.ordinal())
70 .setCellEditor(new DefaultCellEditor(new JComboBox<String>(){{
72 for(int i=1; i <= MIDISpec.MAX_CHANNELS; i++) addItem(String.format("%d", i));
75 setAutoCreateColumnsFromModel(false);
76 Arrays.stream(SequenceTrackListTableModel.Column.values()).forEach(c->
77 getColumnModel().getColumn(c.ordinal()).setPreferredWidth(c.preferredWidth)
79 selectionModel.addListSelectionListener(event->{
80 if( event.getValueIsAdjusting() ) return;
81 deleteTrackAction.setEnabled(! selectionModel.isSelectionEmpty());
82 eventListTable.setModel(getModel().getSelectedTrackModel(selectionModel));
83 eventListTable.titleLabel.showTrackNumber(selectionModel.getMinSelectionIndex());
87 * このテーブルビューが表示するデータを提供するシーケンス(トラックリスト)データモデルを返します。
88 * @return シーケンス(トラックリスト)データモデル
91 public SequenceTrackListTableModel getModel() {
92 return (SequenceTrackListTableModel)dataModel;
95 * このテーブルビューが表示するデータを提供するシーケンス(トラックリスト)データモデルを設定します。
96 * @param model シーケンス(トラックリスト)データモデル
98 public void setModel(SequenceTrackListTableModel model) {
99 if( dataModel == model ) return;
101 if( model == null ) {
102 model = getModel().getParent().emptyTrackListTableModel;
103 addTrackAction.setEnabled(false);
106 addTrackAction.setEnabled(true);
108 super.setModel(model);
113 TitleLabel titleLabel = new TitleLabel();
117 class TitleLabel extends JLabel {
118 private static final String TITLE = "Tracks";
119 public TitleLabel() { setText(TITLE); }
120 public void showMidiFileNumber(ListSelectionModel sequenceSelectionModel) {
122 if( ! sequenceSelectionModel.isSelectionEmpty() ) {
123 int index = sequenceSelectionModel.getMinSelectionIndex();
124 if( index >= 0 ) text = String.format(text+" - MIDI file #%d", index);
132 * <p>このトラックリストテーブルのデータが変わったときに編集を解除します。
133 * 例えば、イベントが編集された場合や、シーケンサーからこのモデルが外された場合がこれに該当します。
137 public void tableChanged(TableModelEvent e) {
138 super.tableChanged(e);
142 * このトラックリストテーブルが編集モードになっていたら解除します。
144 private void cancelCellEditing() {
145 TableCellEditor currentCellEditor = getCellEditor();
146 if( currentCellEditor != null ) currentCellEditor.cancelCellEditing();