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