public TrackListTable(SequenceTrackListTableModel model) {\r
super(model, null, model.trackListSelectionModel);\r
//\r
- // 録音対象のMIDIチャンネルをコンボボックスで選択できるよう、\r
- // 列モデルにセルエディタを設定\r
+ // 録音対象のMIDIチャンネルをコンボボックスで選択できるようにする\r
int colIndex = SequenceTrackListTableModel.Column.RECORD_CHANNEL.ordinal();\r
TableColumn tc = getColumnModel().getColumn(colIndex);\r
tc.setCellEditor(new DefaultCellEditor(new JComboBox<String>(){{\r
setSelectedEvent();\r
midiEventsToBeOverwritten = null; // 追加なので、上書きされるイベントなし\r
eventDialog.setTitle("Add a new MIDI event");\r
- eventDialog.okButton.setAction(eventCellEditor.addEventAction);\r
+ eventDialog.okButton.setAction(eventCellEditor.applyEventAction);\r
int ch = getModel().getChannel();\r
if( ch >= 0 ) {\r
eventDialog.midiMessageForm.channelText.setSelectedChannel(ch);\r
}\r
};\r
/**\r
- * イベント編集アクション\r
- */\r
- private Action editEventAction = new AbstractAction() {\r
- public void actionPerformed(ActionEvent e) {\r
- setSelectedEvent();\r
- if( selectedMidiEvent == null )\r
- return;\r
- MidiEvent partnerEvent = null;\r
- eventDialog.midiMessageForm.setMessage(selectedMidiEvent.getMessage());\r
- if( eventDialog.midiMessageForm.isNote() ) {\r
- int partnerIndex = getModel().getIndexOfPartnerFor(selectedIndex);\r
- if( partnerIndex < 0 ) {\r
- eventDialog.midiMessageForm.durationForm.setDuration(0);\r
- }\r
- else {\r
- partnerEvent = getModel().getMidiEvent(partnerIndex);\r
- long partnerTick = partnerEvent.getTick();\r
- long duration = currentTick > partnerTick ?\r
- currentTick - partnerTick : partnerTick - currentTick ;\r
- eventDialog.midiMessageForm.durationForm.setDuration((int)duration);\r
- }\r
- }\r
- MidiEvent events[];\r
- if( partnerEvent == null ) {\r
- events = new MidiEvent[1];\r
- events[0] = selectedMidiEvent;\r
- }\r
- else {\r
- events = new MidiEvent[2];\r
- events[0] = selectedMidiEvent;\r
- events[1] = partnerEvent;\r
- }\r
- midiEventsToBeOverwritten = events;\r
- eventDialog.setTitle("Change MIDI event");\r
- eventDialog.okButton.setAction(eventCellEditor.addEventAction);\r
- eventDialog.openEventForm();\r
- }\r
- };\r
- /**\r
* MIDIイベント表のセルエディタ\r
*/\r
private MidiEventCellEditor eventCellEditor;\r
*/\r
class MidiEventCellEditor extends AbstractCellEditor implements TableCellEditor {\r
/**\r
- * イベント入力をキャンセルするアクション\r
+ * MIDIイベントセルエディタを構築します。\r
*/\r
- Action cancelAction = new AbstractAction() {\r
- {\r
- putValue(NAME,"Cancel");\r
- eventDialog.cancelButton.setAction(this);\r
- }\r
- public void actionPerformed(ActionEvent e) {\r
- fireEditingCanceled();\r
- eventDialog.setVisible(false);\r
- }\r
- };\r
public MidiEventCellEditor() {\r
eventDialog.midiMessageForm.setOutputMidiChannels(virtualMidiDevice.getChannels());\r
eventDialog.tickPositionInputForm.setModel(tickPositionModel);\r
int index = TrackEventListTableModel.Column.MESSAGE.ordinal();\r
getColumnModel().getColumn(index).setCellEditor(this);\r
}\r
+ /**\r
+ * セルをダブルクリックしないと編集できないようにします。\r
+ * @param e イベント(マウスイベント)\r
+ * @return 編集可能になったらtrue\r
+ */\r
@Override\r
public boolean isCellEditable(EventObject e) {\r
- // ダブルクリックで編集\r
- return e instanceof MouseEvent && ((MouseEvent)e).getClickCount() == 2;\r
+ if( ! (e instanceof MouseEvent) ) return false;\r
+ return ((MouseEvent)e).getClickCount() == 2;\r
}\r
@Override\r
public Object getCellEditorValue() { return ""; }\r
- private JButton editEventButton = new JButton(editEventAction){\r
- {\r
- setHorizontalAlignment(JButton.LEFT);\r
+ /**\r
+ * 既存イベントを編集するアクション\r
+ */\r
+ private Action editEventAction = new AbstractAction() {\r
+ public void actionPerformed(ActionEvent e) {\r
+ setSelectedEvent();\r
+ if( selectedMidiEvent == null )\r
+ return;\r
+ MidiEvent partnerEvent = null;\r
+ eventDialog.midiMessageForm.setMessage(selectedMidiEvent.getMessage());\r
+ if( eventDialog.midiMessageForm.isNote() ) {\r
+ int partnerIndex = getModel().getIndexOfPartnerFor(selectedIndex);\r
+ if( partnerIndex < 0 ) {\r
+ eventDialog.midiMessageForm.durationForm.setDuration(0);\r
+ }\r
+ else {\r
+ partnerEvent = getModel().getMidiEvent(partnerIndex);\r
+ long partnerTick = partnerEvent.getTick();\r
+ long duration = currentTick > partnerTick ?\r
+ currentTick - partnerTick : partnerTick - currentTick ;\r
+ eventDialog.midiMessageForm.durationForm.setDuration((int)duration);\r
+ }\r
+ }\r
+ if(partnerEvent == null)\r
+ midiEventsToBeOverwritten = new MidiEvent[] {selectedMidiEvent};\r
+ else\r
+ midiEventsToBeOverwritten = new MidiEvent[] {selectedMidiEvent, partnerEvent};\r
+ eventDialog.setTitle("Change MIDI event");\r
+ eventDialog.okButton.setAction(applyEventAction);\r
+ eventDialog.cancelButton.addActionListener(cancelActionListener);\r
+ eventDialog.openEventForm();\r
}\r
};\r
+ /**\r
+ * イベント編集ボタン\r
+ */\r
+ private JButton editEventButton = new JButton(editEventAction){{\r
+ setHorizontalAlignment(JButton.LEFT);\r
+ }};\r
@Override\r
public Component getTableCellEditorComponent(\r
JTable table, Object value, boolean isSelected, int row, int column\r
return editEventButton;\r
}\r
/**\r
- * イベントの追加(または変更)を行うアクション\r
+ * イベント入力をキャンセルするアクションリスナーです。\r
+ *\r
+ * <p>セル編集によって表示されたMIDIメッセージダイアログを\r
+ * キャンセルする場合、セル編集を中止する処理の追加が必要です。\r
+ * その追加処理をこのリスナーでカバーします。\r
+ * </p>\r
*/\r
- private Action addEventAction = new AbstractAction() {\r
- { putValue(NAME,"OK"); }\r
+ private ActionListener cancelActionListener = new ActionListener() {\r
+ public void actionPerformed(ActionEvent e) {\r
+ fireEditingCanceled();\r
+ // 用が済んだら当リスナーを除去\r
+ eventDialog.cancelButton.removeActionListener(this);\r
+ }\r
+ };\r
+ /**\r
+ * 入力したイベントを反映するアクション\r
+ */\r
+ private Action applyEventAction = new AbstractAction() {\r
+ {\r
+ putValue(NAME,"OK");\r
+ }\r
public void actionPerformed(ActionEvent e) {\r
long tick = tickPositionModel.getTickPosition();\r
MidiMessage msg = eventDialog.midiMessageForm.getMessage();\r
* Copyright (C) 2006-2013 @きよし - Akiyoshi Kamide\r
* http://www.yk.rim.or.jp/~kamide/music/chordhelper/\r
*/\r
-class MidiEventDialog extends JDialog implements ActionListener {\r
- MidiMessageForm midiMessageForm = new MidiMessageForm();\r
+class MidiEventDialog extends JDialog {\r
/**\r
* tick位置入力フォーム\r
*/\r
extraTickSpinner.setModel(model.extraTickModel);\r
}\r
}\r
- TickPositionInputForm tickPositionInputForm = new TickPositionInputForm();\r
- JButton okButton = new JButton("OK");\r
- JButton cancelButton = new JButton("Cancel");\r
+ /**\r
+ * tick位置入力フォーム\r
+ */\r
+ TickPositionInputForm tickPositionInputForm;\r
+ /**\r
+ * MIDIメッセージ入力フォーム\r
+ */\r
+ MidiMessageForm midiMessageForm;\r
+ /**\r
+ * キャンセルボタン\r
+ */\r
+ JButton cancelButton;\r
+ /**\r
+ * OKボタン(アクションによってラベルがOK以外に変わることがある)\r
+ */\r
+ JButton okButton;\r
+ /**\r
+ * MIDIイベントダイアログの構築\r
+ */\r
public MidiEventDialog() {\r
setLayout(new FlowLayout());\r
- add(tickPositionInputForm);\r
- add(midiMessageForm);\r
- add(new JPanel(){{add(okButton); add(cancelButton);}});\r
- cancelButton.addActionListener(this);\r
- }\r
- public void actionPerformed(ActionEvent e) {\r
- setVisible(false);\r
+ add(tickPositionInputForm = new TickPositionInputForm());\r
+ add(midiMessageForm = new MidiMessageForm());\r
+ add(new JPanel(){{\r
+ add(okButton = new JButton("OK"));\r
+ add(cancelButton = new JButton("Cancel"));\r
+ }});\r
+ cancelButton.addActionListener(new ActionListener() {\r
+ public void actionPerformed(ActionEvent e) {\r
+ setVisible(false);\r
+ }\r
+ });\r
}\r
public void openTickForm() {\r
tickPositionInputForm.setVisible(true);\r
midiMessageForm.setVisible(false);\r
- setBounds( 200, 300, 500, 120 );\r
+ setBounds( 200, 300, 520, 150 );\r
setVisible(true);\r
}\r
public void openEventForm() {\r
tickPositionInputForm.setVisible(true);\r
midiMessageForm.setVisible(true);\r
midiMessageForm.setDurationVisible(true);\r
- setBounds( 200, 300, 630, 320 );\r
+ setBounds( 200, 300, 630, 370 );\r
setVisible(true);\r
}\r
public void openMessageForm() {\r
tickPositionInputForm.setVisible(false);\r
midiMessageForm.setVisible(true);\r
midiMessageForm.setDurationVisible(false);\r
- setBounds( 200, 300, 630, 270 );\r
+ setBounds( 200, 300, 630, 300 );\r
setVisible(true);\r
}\r
}\r
}\r
updateVisible();\r
}\r
- //\r
- // Methods\r
- //\r
- public void setOutputMidiChannels( MidiChannel midi_channels[] ) {\r
- this.midiChannels = midi_channels;\r
+ /**\r
+ * このMIDIメッセージフォームにMIDIチャンネルを設定します。\r
+ *\r
+ * <p>設定したMIDIチャンネルには、\r
+ * ダイアログ内のピアノキーボードで音階を入力したときに\r
+ * ノートON/OFFが出力されます。これにより実際に音として聞けるようになります。\r
+ * </p>\r
+ *\r
+ * @param midiChannels MIDIチャンネル\r
+ */\r
+ public void setOutputMidiChannels( MidiChannel midiChannels[] ) {\r
+ this.midiChannels = midiChannels;\r
}\r
- public void setDurationVisible(boolean is_visible) {\r
- isDurationVisible = is_visible;\r
+ /**\r
+ * 時間間隔入力の表示状態を変更します。\r
+ * @param isVisible trueで表示、falseで非表示\r
+ */\r
+ public void setDurationVisible(boolean isVisible) {\r
+ isDurationVisible = isVisible;\r
updateVisible();\r
}\r
+ /**\r
+ * 時間間隔入力の表示状態を返します。\r
+ * @return true:表示中 false:非表示中\r
+ */\r
public boolean isDurationVisible() {\r
return isDurationVisible;\r
}\r
+ /**\r
+ * 各入力欄の表示状態を更新します。\r
+ */\r
public void updateVisible() {\r
int msgStatus = statusText.getValue();\r
boolean is_ch_msg = MIDISpec.isChannelMessage(msgStatus);\r
break;\r
}\r
}\r
+ /**\r
+ * 入力している内容からMIDIメッセージを生成して返します。\r
+ * @return 入力している内容から生成したMIDIメッセージ\r
+ */\r
public MidiMessage getMessage() {\r
int msg_status = statusText.getValue();\r
if( msg_status < 0 ) {\r
}\r
return (MidiMessage)msg;\r
}\r
+ /**\r
+ * MIDIメッセージを入力欄に反映します。\r
+ * @param msg MIDIメッセージ\r
+ */\r
public void setMessage( MidiMessage msg ) {\r
if( msg instanceof ShortMessage ) {\r
ShortMessage smsg = (ShortMessage)msg;\r
public boolean isNote( boolean note_on, int status ) {\r
int cmd = status & 0xF0;\r
return (\r
- note_on && cmd == ShortMessage.NOTE_ON && data2Text.getValue() > 0\r
- ||\r
- !note_on && (\r
- cmd == ShortMessage.NOTE_ON && data2Text.getValue() <= 0 ||\r
- cmd == ShortMessage.NOTE_OFF\r
- )\r
- );\r
+ note_on && cmd == ShortMessage.NOTE_ON && data2Text.getValue() > 0\r
+ ||\r
+ !note_on && (\r
+ cmd == ShortMessage.NOTE_ON && data2Text.getValue() <= 0 ||\r
+ cmd == ShortMessage.NOTE_OFF\r
+ )\r
+ );\r
}\r
public ShortMessage getPartnerMessage() {\r
ShortMessage sm = (ShortMessage)getMessage();\r