OSDN Git Service

・プレイリストで曲選択クリア時にイベント一覧がクリアされない問題の改善
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / midieditor / SequenceTrackListTable.java
1 package camidion.chordhelper.midieditor;
2
3 import java.awt.event.ActionEvent;
4 import java.util.Arrays;
5
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;
18
19 import camidion.chordhelper.ChordHelperApplet;
20 import camidion.chordhelper.music.MIDISpec;
21
22 /**
23  * シーケンス(トラックリスト)テーブルビュー
24  */
25 public class SequenceTrackListTable extends JTable {
26         /**
27          * トラック追加アクション
28          */
29         Action addTrackAction = new AbstractAction("New") {
30                 {
31                         String tooltip = "Append new track - 新しいトラックの追加";
32                         putValue(Action.SHORT_DESCRIPTION, tooltip);
33                         setEnabled(false);
34                 }
35                 @Override
36                 public void actionPerformed(ActionEvent e) { getModel().createTrack(); }
37         };
38         /**
39          * トラック削除アクション
40          */
41         Action deleteTrackAction = new AbstractAction("Delete", MidiSequenceEditorDialog.deleteIcon) {
42                 public static final String CONFIRM_MESSAGE =
43                                 "Do you want to delete selected track ?\n選択したトラックを削除しますか?";
44                 {
45                         putValue(Action.SHORT_DESCRIPTION, "Delete selected track - 選択したトラックを削除");
46                         setEnabled(false);
47                 }
48                 @Override
49                 public void actionPerformed(ActionEvent event) {
50                         if( JOptionPane.showConfirmDialog(
51                                         ((JComponent)event.getSource()).getRootPane(),
52                                         CONFIRM_MESSAGE,
53                                         ChordHelperApplet.VersionInfo.NAME,
54                                         JOptionPane.YES_NO_OPTION,
55                                         JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION
56                         ) getModel().deleteSelectedTracks();
57                 }
58         };
59         /**
60          * トラック選択リスナー
61          */
62         private ListSelectionListener trackSelectionListener;
63         /**
64          * トラックリストテーブルビューを構築します。
65          * @param model シーケンス(トラックリスト)データモデル
66          * @param eventListTable イベントリストテーブル
67          */
68         public SequenceTrackListTable(SequenceTrackListTableModel model, MidiEventTable eventListTable) {
69                 super(model, null, model.getSelectionModel());
70                 getColumnModel()
71                         .getColumn(SequenceTrackListTableModel.Column.RECORD_CHANNEL.ordinal())
72                         .setCellEditor(new DefaultCellEditor(new JComboBox<String>(){{
73                                 addItem("OFF");
74                                 for(int i=1; i <= MIDISpec.MAX_CHANNELS; i++) addItem(String.format("%d", i));
75                                 addItem("ALL");
76                         }}));
77                 setAutoCreateColumnsFromModel(false);
78                 Arrays.stream(SequenceTrackListTableModel.Column.values()).forEach(c->
79                         getColumnModel().getColumn(c.ordinal()).setPreferredWidth(c.preferredWidth)
80                 );
81                 selectionModel.addListSelectionListener(trackSelectionListener = event->{
82                         if( event.getValueIsAdjusting() ) return;
83                         deleteTrackAction.setEnabled(! selectionModel.isSelectionEmpty());
84                         eventListTable.setModel(getModel().getSelectedTrackModel());
85                 });
86         }
87         /**
88          * このテーブルビューが表示するデータを提供するシーケンス(トラックリスト)データモデルを返します。
89          * @return シーケンス(トラックリスト)データモデル
90          */
91         @Override
92         public SequenceTrackListTableModel getModel() {
93                 return (SequenceTrackListTableModel)dataModel;
94         }
95         /**
96          * このテーブルビューが表示するデータを提供するシーケンス(トラックリスト)データモデルを設定します。
97          * @param model シーケンス(トラックリスト)データモデル
98          */
99         public void setModel(SequenceTrackListTableModel model) {
100                 if( dataModel == model ) return;
101                 cancelCellEditing();
102                 if( model == null ) {
103                         model = getModel().getParent().emptyTrackListTableModel;
104                         addTrackAction.setEnabled(false);
105                 }
106                 else {
107                         addTrackAction.setEnabled(true);
108                 }
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);
115         }
116         /**
117          * 曲番号表示付きタイトルラベル
118          */
119         TitleLabel titleLabel = new TitleLabel();
120         /**
121          * 曲番号表示付きタイトルラベル
122          */
123         private class TitleLabel extends JLabel {
124                 private static final String TITLE = "Tracks";
125                 public TitleLabel() { setText(TITLE); }
126                 public void setSelection(ListSelectionModel sequenceSelectionModel) {
127                         String text = TITLE;
128                         if( ! sequenceSelectionModel.isSelectionEmpty() ) {
129                                 int index = sequenceSelectionModel.getMinSelectionIndex();
130                                 if( index >= 0 ) text = String.format(text+" - MIDI file #%d", index);
131                         }
132                         setText(text);
133                 }
134         }
135         /**
136          * {@inheritDoc}
137          *
138          * <p>このトラックリストテーブルのデータが変わったときに編集を解除します。
139          * 例えば、イベントが編集された場合や、シーケンサーからこのモデルが外された場合がこれに該当します。
140          * </p>
141          */
142         @Override
143         public void tableChanged(TableModelEvent e) {
144                 super.tableChanged(e);
145                 cancelCellEditing();
146         }
147         /**
148          * このトラックリストテーブルが編集モードになっていたら解除します。
149          */
150         private void cancelCellEditing() {
151                 TableCellEditor currentCellEditor = getCellEditor();
152                 if( currentCellEditor != null ) currentCellEditor.cancelCellEditing();
153         }
154 }