import java.net.URL;
import java.security.AccessControlException;
import java.util.Arrays;
-import java.util.Vector;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MetaEventListener;
import javax.sound.midi.MetaMessage;
-import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.swing.Box;
import javax.swing.BoxLayout;
import camidion.chordhelper.mididevice.MidiTransceiverListModelList;
import camidion.chordhelper.mididevice.SequencerMeasureView;
import camidion.chordhelper.mididevice.SequencerTimeView;
-import camidion.chordhelper.mididevice.VirtualMidiDevice;
import camidion.chordhelper.midieditor.Base64Dialog;
import camidion.chordhelper.midieditor.KeySignatureLabel;
import camidion.chordhelper.midieditor.MidiSequenceEditor;
+import camidion.chordhelper.midieditor.NewSequenceDialog;
import camidion.chordhelper.midieditor.SequenceTickIndex;
import camidion.chordhelper.midieditor.SequenceTrackListTableModel;
import camidion.chordhelper.midieditor.TempoSelecter;
* @return 追加先のインデックス値(0から始まる)。追加できなかったときは -1
*/
public int addRandomSongToPlaylist(int measureLength) {
- deviceModelList.getEditorDialog().newSequenceDialog.setRandomChordProgression(measureLength);
- Sequence sequence = deviceModelList.getEditorDialog().newSequenceDialog.getMidiSequence();
- return deviceModelList.getEditorDialog().sequenceListTable.getModel().addSequenceAndPlay(sequence);
+ MidiSequenceEditor editor = deviceModelList.getEditorDialog();
+ NewSequenceDialog d = editor.newSequenceDialog;
+ d.setRandomChordProgression(measureLength);
+ return editor.sequenceListTable.getModel().addSequenceAndPlay(d.getMidiSequence());
}
/**
* URLで指定されたMIDIファイルをプレイリストへ追加します。
*/
public static class VersionInfo {
public static final String NAME = "MIDI Chord Helper";
- public static final String VERSION = "Ver.20160511.1";
+ public static final String VERSION = "Ver.20160514.1";
public static final String COPYRIGHT = "Copyright (C) 2004-2016";
public static final String AUTHER = "@きよし - Akiyoshi Kamide";
public static final String URL = "http://www.yk.rim.or.jp/~kamide/music/chordhelper/";
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(
- null, this, "Version info",
- JOptionPane.INFORMATION_MESSAGE, imageIcon
+ null, this, "Version info", JOptionPane.INFORMATION_MESSAGE, imageIcon
);
}
}
keyboardCenterPanel.keyboard.addPianoKeyboardListener(
new PianoKeyboardAdapter() {
@Override
- public void pianoKeyPressed(int n, InputEvent e) {
- chordDiagram.clear();
- }
+ public void pianoKeyPressed(int n, InputEvent e) { chordDiagram.clear(); }
}
);
keySelecter.keysigCombobox.addActionListener(
keyboardCenterPanel.keyboard.setPreferredSize(new Dimension(571, 80));
}};
deviceModelList = new MidiTransceiverListModelList(
- new Vector<VirtualMidiDevice>() {
- {
- add(keyboardPanel.keyboardCenterPanel.keyboard.midiDevice);
- }
- }
+ Arrays.asList(keyboardPanel.keyboardCenterPanel.keyboard.midiDevice)
);
deviceModelList.getEditorDialog().setIconImage(iconImage);
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, deviceModelList.getEditorDialog().dropTargetListener, true);
}};
keysigLabel = new KeySignatureLabel() {{
addMouseListener(new MouseAdapter() {
- public void mousePressed(MouseEvent e) {
- chordMatrix.setKeySignature(getKey());
- }
+ public void mousePressed(MouseEvent e) { chordMatrix.setKeySignature(getKey()); }
});
}};
deviceModelList.getSequencerModel().getSequencer().addMetaEventListener(
new MetaEventListener() {
class SetKeySignatureRunnable implements Runnable {
Key key;
- public SetKeySignatureRunnable(Key key) {
- this.key = key;
- }
+ public SetKeySignatureRunnable(Key key) { this.key = key; }
@Override
public void run() { setKeySignature(key); }
}
case 0x59: // Key signature (2 bytes) : 調号
Key key = new Key(msg.getData());
if( ! SwingUtilities.isEventDispatchThread() ) {
- SwingUtilities.invokeLater(
- new SetKeySignatureRunnable(key)
- );
+ SwingUtilities.invokeLater(new SetKeySignatureRunnable(key));
}
setKeySignature(key);
break;
add(anoGakkiPane = new AnoGakkiPane(), JLayeredPane.PALETTE_LAYER);
addComponentListener(new ComponentAdapter() {
@Override
- public void componentResized(ComponentEvent e) {
- adjustSize();
- }
+ public void componentResized(ComponentEvent e) { adjustSize(); }
@Override
- public void componentShown(ComponentEvent e) {
- adjustSize();
- }
- private void adjustSize() {
- anoGakkiPane.setBounds(getBounds());
- }
+ public void componentShown(ComponentEvent e) { adjustSize(); }
+ private void adjustSize() { anoGakkiPane.setBounds(getBounds()); }
});
setLayout(new BorderLayout());
setOpaque(true);
add(mainSplitPane = new JSplitPane(
- JSplitPane.VERTICAL_SPLIT,
- chordMatrix, keyboardSequencerPanel
+ JSplitPane.VERTICAL_SPLIT, chordMatrix, keyboardSequencerPanel
){
{
setResizeWeight(0.5);
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.AccessControlException;
+import java.util.Arrays;
import java.util.EventObject;
import java.util.List;
import java.util.Map;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
-import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellEditor;
* http://www.yk.rim.or.jp/~kamide/music/chordhelper/
*/
public class MidiSequenceEditor extends JDialog {
+ /**
+ * このダイアログを表示するアクション
+ */
+ public Action openAction = new AbstractAction("Edit/Playlist/Speed", new ButtonIcon(ButtonIcon.EDIT_ICON)) {
+ {
+ String tooltip = "MIDIシーケンスの編集/プレイリスト/再生速度調整";
+ putValue(Action.SHORT_DESCRIPTION, tooltip);
+ }
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if( isVisible() ) toFront(); else setVisible(true);
+ }
+ };
+
+ /**
+ * このMIDIエディタにおける操作音の出力先となる仮想MIDIデバイスを返します。
+ */
+ public VirtualMidiDevice getVirtualMidiDevice() { return virtualMidiDevice; }
private static VirtualMidiDevice virtualMidiDevice = new AbstractVirtualMidiDevice() {
{
info = new MyInfo();
*/
protected MyInfo info;
@Override
- public Info getDeviceInfo() {
- return info;
- }
+ public Info getDeviceInfo() { return info; }
class MyInfo extends Info {
- protected MyInfo() {
- super("MIDI Editor","Unknown vendor","MIDI sequence editor","");
- }
+ protected MyInfo() { super("MIDI Editor","Unknown vendor","MIDI sequence editor",""); }
}
};
- /**
- * このMIDIエディタの仮想MIDIデバイスを返します。
- */
- public VirtualMidiDevice getVirtualMidiDevice() {
- return virtualMidiDevice;
- }
- /**
- * このダイアログを表示するアクション
- */
- public Action openAction = new AbstractAction(
- "Edit/Playlist/Speed", new ButtonIcon(ButtonIcon.EDIT_ICON)
- ) {
- {
- String tooltip = "MIDIシーケンスの編集/プレイリスト/再生速度調整";
- putValue(Action.SHORT_DESCRIPTION, tooltip);
- }
- @Override
- public void actionPerformed(ActionEvent e) { open(); }
- };
- /**
- * このダイアログを開きます。すでに開かれていた場合は前面に移動します。
- */
- public void open() {
- if( isVisible() ) toFront(); else setVisible(true);
- }
+
/**
* エラーメッセージダイアログを表示します。
* @param message エラーメッセージ
*/
- public void showError(String message) {
- JOptionPane.showMessageDialog(
- this, message,
- ChordHelperApplet.VersionInfo.NAME,
- JOptionPane.ERROR_MESSAGE
- );
- }
+ public void showError(String message) { showMessage(message, JOptionPane.ERROR_MESSAGE); }
/**
* 警告メッセージダイアログを表示します。
* @param message 警告メッセージ
*/
- public void showWarning(String message) {
- JOptionPane.showMessageDialog(
- this, message,
- ChordHelperApplet.VersionInfo.NAME,
- JOptionPane.WARNING_MESSAGE
- );
+ public void showWarning(String message) { showMessage(message, JOptionPane.WARNING_MESSAGE); }
+ private void showMessage(String message, int messageType) {
+ JOptionPane.showMessageDialog(this, message, ChordHelperApplet.VersionInfo.NAME, messageType);
}
/**
* 確認ダイアログを表示します。
* @return 確認OKのときtrue
*/
boolean confirm(String message) {
- return JOptionPane.showConfirmDialog(
- this, message,
- ChordHelperApplet.VersionInfo.NAME,
- JOptionPane.YES_NO_OPTION,
- JOptionPane.WARNING_MESSAGE
- ) == JOptionPane.YES_OPTION ;
+ return JOptionPane.showConfirmDialog(this, message, ChordHelperApplet.VersionInfo.NAME,
+ JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION ;
}
+
/**
* ドロップされた複数のMIDIファイルを読み込むリスナー
*/
event.dropComplete(false);
}
};
+
/**
* 複数のMIDIファイルを読み込み、再生されていなかったら再生します。
* すでに再生されていた場合、このエディタダイアログを表示します。
*
* @param fileList 読み込むMIDIファイルのリスト
+ * @see #loadAndPlay(File)
*/
public void loadAndPlay(List<File> fileList) {
- int firstIndex = -1;
+ int indexOfAddedTop = -1;
PlaylistTableModel playlist = sequenceListTable.getModel();
try {
- firstIndex = playlist.addSequences(fileList);
+ indexOfAddedTop = playlist.addSequences(fileList);
} catch(IOException|InvalidMidiDataException e) {
showWarning(e.getMessage());
} catch(AccessControlException e) {
showError(e.getMessage());
e.printStackTrace();
}
- if(playlist.sequencerModel.getSequencer().isRunning()) {
- open();
+ MidiSequencerModel sequencerModel = playlist.sequencerModel;
+ if( sequencerModel.getSequencer().isRunning() ) {
+ String command = (String)openAction.getValue(Action.NAME);
+ openAction.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, command));
+ return;
}
- else if( firstIndex >= 0 ) {
- playlist.loadToSequencer(firstIndex);
- playlist.sequencerModel.start();
+ if( indexOfAddedTop >= 0 ) {
+ playlist.loadToSequencer(indexOfAddedTop);
+ sequencerModel.start();
}
}
+ /**
+ * 1件のMIDIファイルを読み込み、再生されていなかったら再生します。
+ * すでに再生されていた場合、このエディタダイアログを表示します。
+ *
+ * @param file 読み込むMIDIファイル
+ * @see #loadAndPlay(List) loadAndPlay(List<File>)
+ */
+ public void loadAndPlay(File file) { loadAndPlay(Arrays.asList(file)); }
+
private static final Insets ZERO_INSETS = new Insets(0,0,0,0);
private static final Icon deleteIcon = new ButtonIcon(ButtonIcon.X_ICON);
/**
/**
* MIDIイベント入力ダイアログ(イベント入力とイベント送出で共用)
*/
- public MidiEventDialog eventDialog = new MidiEventDialog();
+ public MidiEventDialog eventDialog = new MidiEventDialog();
/**
* プレイリストビュー(シーケンスリスト)
*/
public class SequenceListTable extends JTable {
/**
- * ã\83\95ã\82¡ã\82¤ã\83«é\81¸æ\8a\9eã\83\80ã\82¤ã\82¢ã\83ã\82°ï¼\88ã\82¢ã\83\97ã\83¬ã\83\83ã\83\88ã\81§ã\81¯ä½¿ç\94¨ä¸\8då\8f¯)
+ * ã\83\95ã\82¡ã\82¤ã\83«é\81¸æ\8a\9eã\83\80ã\82¤ã\82¢ã\83ã\82°ï¼\88ã\82¢ã\83\97ã\83¬ã\83\83ã\83\88ã\81®å ´å\90\88ã\81¯ä½¿ç\94¨ä¸\8då\8f¯ã\81ªã\81®ã\81§null)
*/
private MidiFileChooser midiFileChooser;
/**
for( PlaylistTableModel.Column c : PlaylistTableModel.Column.values() ) {
TableColumn tc = colModel.getColumn(c.ordinal());
tc.setPreferredWidth(c.preferredWidth);
- if( c == PlaylistTableModel.Column.LENGTH ) {
- lengthColumn = tc;
- }
+ if( c == PlaylistTableModel.Column.LENGTH ) lengthColumn = tc;
}
}
private TableColumn lengthColumn;
// 列モデルからではヘッダタイトルが再描画されないことがある。
// そこで、ヘッダビューから repaint() で突っついて再描画させる。
JTableHeader th = getTableHeader();
- if( th != null ) {
- th.repaint();
- }
+ if( th != null ) th.repaint();
}
/**
* 時間位置表示セルエディタ(ダブルクリック専用)
{
private JToggleButton playButton = new JToggleButton(
getModel().sequencerModel.startStopAction
- );
+ ) {
+ { setMargin(ZERO_INSETS); }
+ };
public PlayButtonCellEditor() {
- playButton.setMargin(ZERO_INSETS);
int column = PlaylistTableModel.Column.PLAY.ordinal();
TableColumn tc = getColumnModel().getColumn(column);
tc.setCellRenderer(this);
*/
@Override
public boolean isCellEditable(EventObject e) {
- if( ! (e instanceof MouseEvent) ) {
- // マウスイベント以外はデフォルトメソッドにお任せ
- return super.isCellEditable(e);
- }
+ // マウスイベント以外はデフォルトメソッドにお任せ
+ if( ! (e instanceof MouseEvent) ) return super.isCellEditable(e);
fireEditingStopped();
MouseEvent me = (MouseEvent)e;
+ //
// クリックされたセルの行を特定
int row = rowAtPoint(me.getPoint());
- if( row < 0 )
- return false;
+ if( row < 0 ) return false;
PlaylistTableModel model = getModel();
- if( row >= model.getRowCount() )
- return false;
- if( model.sequenceList.get(row).isOnSequencer() ) {
- // プレイボタン表示中のセルはシングルクリックでもOK
- return true;
- }
- // プレイボタンのないセルはダブルクリックのみを受け付ける
- return me.getClickCount() == 2;
+ if( row >= model.getRowCount() ) return false;
+ //
+ // セル内にプレイボタンがあれば、シングルクリックを受け付ける。
+ // プレイボタンのないセルは、ダブルクリックのみ受け付ける。
+ return model.sequenceList.get(row).isOnSequencer() || me.getClickCount() == 2;
}
@Override
public Object getCellEditorValue() { return null; }
) {
fireEditingStopped();
PlaylistTableModel model = getModel();
- if( model.sequenceList.get(row).isOnSequencer() ) {
- return playButton;
- }
+ if( model.sequenceList.get(row).isOnSequencer() ) return playButton;
model.loadToSequencer(row);
return null;
}
* @return プレイリストモデル
*/
@Override
- public PlaylistTableModel getModel() {
- return (PlaylistTableModel) super.getModel();
- }
+ public PlaylistTableModel getModel() { return (PlaylistTableModel)super.getModel(); }
/**
* シーケンスを削除するアクション
*/
public void actionPerformed(ActionEvent e) {
PlaylistTableModel model = getModel();
if( midiFileChooser != null ) {
- // ファイルに保存できる場合(Javaアプレットではなく、Javaアプリとして動作している場合)
- //
- SequenceTrackListTableModel seqModel = model.getSelectedSequenceModel();
- if( seqModel.isModified() ) {
- // ファイル未保存の変更がある場合
- //
+ if( model.getSelectedSequenceModel().isModified() ) {
String message =
"Selected MIDI sequence not saved - delete it ?\n" +
"選択したMIDIシーケンスはまだ保存されていません。削除しますか?";
- if( ! confirm(message) ) {
- // 実は削除してほしくなかった場合
- return;
- }
+ if( ! confirm(message) ) return;
}
}
- // 削除を実行
model.removeSelectedSequence();
}
};
*/
private class MidiFileChooser extends JFileChooser {
{
- String description = "MIDI sequence (*.mid)";
- String extension = "mid";
- FileFilter filter = new FileNameExtensionFilter(description, extension);
- setFileFilter(filter);
+ setFileFilter(new FileNameExtensionFilter("MIDI sequence (*.mid)", "mid"));
}
/**
* ファイル保存アクション
"Save selected MIDI sequence to file - 選択したMIDIシーケンスをファイルに保存"
) {
@Override
- public void actionPerformed(ActionEvent e) {
- PlaylistTableModel model = getModel();
- SequenceTrackListTableModel sequenceModel = model.getSelectedSequenceModel();
- String filename = sequenceModel.getFilename();
- File selectedFile;
- if( filename != null && ! filename.isEmpty() ) {
- // プレイリスト上でファイル名が入っていたら、それを初期選択
- setSelectedFile(selectedFile = new File(filename));
- }
- int saveOption = showSaveDialog(MidiSequenceEditor.this);
- if( saveOption != JFileChooser.APPROVE_OPTION ) {
- // 保存ダイアログでキャンセルされた場合
- return;
- }
- if( (selectedFile = getSelectedFile()).exists() ) {
- // 指定されたファイルがすでにあった場合
- String fn = selectedFile.getName();
- String message = "Overwrite " + fn + " ?\n";
- message += fn + " を上書きしてよろしいですか?";
- if( ! confirm(message) ) {
- // 上書きしてほしくなかった場合
- return;
- }
+ public void actionPerformed(ActionEvent event) {
+ SequenceTrackListTableModel sequenceModel = getModel().getSelectedSequenceModel();
+ String fn = sequenceModel.getFilename();
+ if( fn != null && ! fn.isEmpty() ) setSelectedFile(new File(fn));
+ if( showSaveDialog((Component)event.getSource()) != JFileChooser.APPROVE_OPTION ) return;
+ File f = getSelectedFile();
+ if( f.exists() ) {
+ fn = f.getName();
+ if( ! confirm("Overwrite " + fn + " ?\n" + fn + " を上書きしてよろしいですか?") ) return;
}
- // 保存を実行
- try ( FileOutputStream out = new FileOutputStream(selectedFile) ) {
+ try ( FileOutputStream out = new FileOutputStream(f) ) {
out.write(sequenceModel.getMIDIdata());
sequenceModel.setModified(false);
}
* ファイルを開くアクション
*/
public Action openMidiFileAction = new AbstractAction("Open") {
- {
- String tooltip = "Open MIDI file - MIDIファイルを開く";
- putValue(Action.SHORT_DESCRIPTION, tooltip);
- }
+ { putValue(Action.SHORT_DESCRIPTION, "Open MIDI file - MIDIファイルを開く"); }
@Override
public void actionPerformed(ActionEvent event) {
- int openOption = showOpenDialog(MidiSequenceEditor.this);
- if(openOption == JFileChooser.APPROVE_OPTION) {
- try {
- getModel().addSequence(getSelectedFile());
- } catch( IOException|InvalidMidiDataException e ) {
- showWarning(e.getMessage());
- } catch( AccessControlException e ) {
- showError(e.getMessage());
- e.printStackTrace();
- }
- }
+ if( showOpenDialog((Component)event.getSource()) != JFileChooser.APPROVE_OPTION ) return;
+ loadAndPlay(getSelectedFile());
}
};
};
TableColumn tc = getColumnModel().getColumn(colIndex);
tc.setCellEditor(new DefaultCellEditor(new JComboBox<String>(){{
addItem("OFF");
- for(int i=1; i <= MIDISpec.MAX_CHANNELS; i++)
- addItem(String.format("%d", i));
+ for(int i=1; i <= MIDISpec.MAX_CHANNELS; i++) addItem(String.format("%d", i));
addItem("ALL");
}}));
setAutoCreateColumnsFromModel(false);
public TitleLabel() { setText(TITLE); }
@Override
public void valueChanged(ListSelectionEvent event) {
- if( event.getValueIsAdjusting() )
- return;
+ if( event.getValueIsAdjusting() ) return;
SequenceTrackListTableModel oldModel = getModel();
SequenceTrackListTableModel newModel = oldModel.sequenceListTableModel.getSelectedSequenceModel();
- if( oldModel == newModel )
- return;
+ if( oldModel == newModel ) return;
//
// MIDIチャンネル選択中のときはキャンセルする
cancelCellEditing();
//
int index = oldModel.sequenceListTableModel.sequenceListSelectionModel.getMinSelectionIndex();
String text = TITLE;
- if( index >= 0 ) {
- text = String.format(text+" - MIDI file No.%d", index);
- }
+ if( index >= 0 ) text = String.format(text+" - MIDI file No.%d", index);
setText(text);
if( newModel == null ) {
newModel = oldModel.sequenceListTableModel.emptyTrackListTableModel;
private class TrackSelectionListener implements ListSelectionListener {
@Override
public void valueChanged(ListSelectionEvent e) {
- if( e != null && e.getValueIsAdjusting() )
- return;
+ if( e != null && e.getValueIsAdjusting() ) return;
ListSelectionModel tlsm = getModel().trackListSelectionModel;
deleteTrackAction.setEnabled(! tlsm.isSelectionEmpty());
eventListTable.titleLabel.update(tlsm, getModel());
*/
private void cancelCellEditing() {
TableCellEditor currentCellEditor = getCellEditor();
- if( currentCellEditor != null )
- currentCellEditor.cancelCellEditing();
+ if( currentCellEditor != null ) currentCellEditor.cancelCellEditing();
}
/**
* トラック追加アクション
setEnabled(false);
}
@Override
- public void actionPerformed(ActionEvent e) {
- getModel().createTrack();
- }
+ public void actionPerformed(ActionEvent e) { getModel().createTrack(); }
};
/**
* トラック削除アクション
}
@Override
public void actionPerformed(ActionEvent e) {
- String message = "Do you want to delete selected track ?\n"
- + "選択したトラックを削除しますか?";
+ String message = "Do you want to delete selected track ?\n選択したトラックを削除しますか?";
if( confirm(message) ) getModel().deleteSelectedTracks();
}
};
private JToggleButton.ToggleButtonModel
pairNoteOnOffModel = new JToggleButton.ToggleButtonModel() {
{
- addItemListener(
- new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- eventDialog.midiMessageForm.durationForm.setEnabled(isSelected());
- }
+ addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent e) {
+ eventDialog.midiMessageForm.durationForm.setEnabled(isSelected());
}
- );
+ });
setSelected(true);
}
};
*/
@Override
public boolean isCellEditable(EventObject e) {
- if( ! (e instanceof MouseEvent) )
- return super.isCellEditable(e);
+ if( ! (e instanceof MouseEvent) ) return super.isCellEditable(e);
return ((MouseEvent)e).getClickCount() == 2;
}
@Override
* @param deviceModelList MIDIデバイスモデルリスト
*/
public MidiSequenceEditor(MidiSequencerModel sequencerModel) {
- // テーブルモデルとテーブルビューの生成
- sequenceListTable = new SequenceListTable(
- new PlaylistTableModel(sequencerModel)
- );
+ sequenceListTable = new SequenceListTable(new PlaylistTableModel(sequencerModel));
trackListTable = new TrackListTable(
new SequenceTrackListTableModel(sequenceListTable.getModel(), null, null)
);
- eventListTable = new EventListTable(
- new TrackEventListTableModel(trackListTable.getModel(), null)
- );
- // レイアウト
+ eventListTable = new EventListTable(new TrackEventListTableModel(trackListTable.getModel(), null));
setTitle("MIDI Editor/Playlist - MIDI Chord Helper");
setBounds( 150, 200, 900, 500 );
setLayout(new FlowLayout());
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, dropTargetListener, true);
+ //
+ // パネルレイアウト
JPanel playlistPanel = new JPanel() {{
JPanel playlistOperationPanel = new JPanel() {{
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
add(Box.createRigidArea(new Dimension(10, 0)));
- add(new JButton(newSequenceDialog.openAction) {{
- setMargin(ZERO_INSETS);
- }});
+ add(new JButton(newSequenceDialog.openAction) {{ setMargin(ZERO_INSETS); }});
if( sequenceListTable.midiFileChooser != null ) {
add( Box.createRigidArea(new Dimension(5, 0)) );
- add(new JButton(
- sequenceListTable.midiFileChooser.openMidiFileAction
- ) {{
+ add(new JButton(sequenceListTable.midiFileChooser.openMidiFileAction) {{
setMargin(ZERO_INSETS);
}});
}
if(sequenceListTable.base64EncodeAction != null) {
add(Box.createRigidArea(new Dimension(5, 0)));
- add(new JButton(sequenceListTable.base64EncodeAction) {{
- setMargin(ZERO_INSETS);
- }});
+ add(new JButton(sequenceListTable.base64EncodeAction) {{ setMargin(ZERO_INSETS); }});
}
add(Box.createRigidArea(new Dimension(5, 0)));
PlaylistTableModel playlistTableModel = sequenceListTable.getModel();
- add(new JButton(playlistTableModel.moveToTopAction) {{
- setMargin(ZERO_INSETS);
- }});
+ add(new JButton(playlistTableModel.moveToTopAction) {{ setMargin(ZERO_INSETS); }});
add(Box.createRigidArea(new Dimension(5, 0)));
- add(new JButton(playlistTableModel.moveToBottomAction) {{
- setMargin(ZERO_INSETS);
- }});
+ add(new JButton(playlistTableModel.moveToBottomAction) {{ setMargin(ZERO_INSETS); }});
if( sequenceListTable.midiFileChooser != null ) {
add(Box.createRigidArea(new Dimension(5, 0)));
- add(new JButton(
- sequenceListTable.midiFileChooser.saveMidiFileAction
- ) {{
+ add(new JButton(sequenceListTable.midiFileChooser.saveMidiFileAction) {{
setMargin(ZERO_INSETS);
}});
}
add( Box.createRigidArea(new Dimension(5, 0)) );
- add(new JButton(sequenceListTable.deleteSequenceAction) {{
- setMargin(ZERO_INSETS);
- }});
+ add(new JButton(sequenceListTable.deleteSequenceAction) {{ setMargin(ZERO_INSETS); }});
add( Box.createRigidArea(new Dimension(5, 0)) );
- add(new SequencerSpeedSlider(
- playlistTableModel.sequencerModel.speedSliderModel
- ));
+ add(new SequencerSpeedSlider(playlistTableModel.sequencerModel.speedSliderModel));
add( Box.createRigidArea(new Dimension(5, 0)) );
add(new JPanel() {{
+ MidiSequencerModel sequencerModel = sequenceListTable.getModel().sequencerModel;
add(new JLabel("SyncMode:"));
add(new JLabel("Master"));
- add(new JComboBox<Sequencer.SyncMode>(
- sequenceListTable.getModel().sequencerModel.masterSyncModeModel
- ));
+ add(new JComboBox<Sequencer.SyncMode>(sequencerModel.masterSyncModeModel));
add(new JLabel("Slave"));
- add(new JComboBox<Sequencer.SyncMode>(
- sequenceListTable.getModel().sequencerModel.slaveSyncModeModel
- ));
+ add(new JComboBox<Sequencer.SyncMode>(sequencerModel.slaveSyncModeModel));
}});
}};
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
}};
JPanel trackListPanel = new JPanel() {{
JPanel trackListOperationPanel = new JPanel() {{
- add(new JButton(trackListTable.addTrackAction) {{
- setMargin(ZERO_INSETS);
- }});
- add(new JButton(trackListTable.deleteTrackAction) {{
- setMargin(ZERO_INSETS);
- }});
+ add(new JButton(trackListTable.addTrackAction) {{ setMargin(ZERO_INSETS); }});
+ add(new JButton(trackListTable.deleteTrackAction) {{ setMargin(ZERO_INSETS); }});
}};
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(trackListTable.titleLabel);
setModel(eventListTable.pairNoteOnOffModel);
setToolTipText("NoteON/OFFをペアで同時選択する");
}});
- add(new JButton(eventListTable.queryJumpEventAction) {{
- setMargin(ZERO_INSETS);
- }});
- add(new JButton(eventListTable.queryAddEventAction) {{
- setMargin(ZERO_INSETS);
- }});
- add(new JButton(eventListTable.copyEventAction) {{
- setMargin(ZERO_INSETS);
- }});
- add(new JButton(eventListTable.cutEventAction) {{
- setMargin(ZERO_INSETS);
- }});
- add(new JButton(eventListTable.queryPasteEventAction) {{
- setMargin(ZERO_INSETS);
- }});
- add(new JButton(eventListTable.deleteEventAction) {{
- setMargin(ZERO_INSETS);
- }});
+ add(new JButton(eventListTable.queryJumpEventAction) {{ setMargin(ZERO_INSETS); }});
+ add(new JButton(eventListTable.queryAddEventAction) {{ setMargin(ZERO_INSETS); }});
+ add(new JButton(eventListTable.copyEventAction) {{ setMargin(ZERO_INSETS); }});
+ add(new JButton(eventListTable.cutEventAction) {{ setMargin(ZERO_INSETS); }});
+ add(new JButton(eventListTable.queryPasteEventAction) {{ setMargin(ZERO_INSETS); }});
+ add(new JButton(eventListTable.deleteEventAction) {{ setMargin(ZERO_INSETS); }});
}};
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(eventListTable.titleLabel);
* @return 未保存の修正内容を持つシーケンスがあればtrue
*/
public boolean isModified() {
- for( SequenceTrackListTableModel m : sequenceList ) {
- if( m.isModified() ) return true;
- }
+ for( SequenceTrackListTableModel m : sequenceList ) if( m.isModified() ) return true;
return false;
}
/**
*/
public void fireSequenceModified(SequenceTrackListTableModel sequenceTableModel) {
int index = sequenceList.indexOf(sequenceTableModel);
- if( index < 0 )
- return;
+ if( index < 0 ) return;
sequenceTableModel.setModified(true);
fireTableRowsUpdated(index, index);
}
* @return 追加されたシーケンスのインデックス(先頭が 0)
*/
public int addSequence(Sequence sequence, String filename) {
- sequenceList.add(
- new SequenceTrackListTableModel(this, sequence, filename)
- );
+ sequenceList.add( new SequenceTrackListTableModel(this, sequence, filename) );
int lastIndex = sequenceList.size() - 1;
fireTableRowsInserted(lastIndex, lastIndex);
return lastIndex;
* @throws InvalidMidiDataException ファイル内のMIDIデータが正しくない場合
* @throws IOException ファイル入出力に失敗した場合
*/
- public int addSequences(List<File> fileList)
- throws InvalidMidiDataException, IOException
- {
+ public int addSequences(List<File> fileList) throws InvalidMidiDataException, IOException {
int firstIndex = -1;
for( File file : fileList ) {
int lastIndex = addSequence(file);
- if( firstIndex == -1 )
- firstIndex = lastIndex;
+ if( firstIndex == -1 ) firstIndex = lastIndex;
}
return firstIndex;
}
public int addSequenceFromURL(String midiFileUrl)
throws URISyntaxException, IOException, InvalidMidiDataException
{
- URI uri = new URI(midiFileUrl);
- URL url = uri.toURL();
- Sequence seq = MidiSystem.getSequence(url);
- String filename = url.getFile().replaceFirst("^.*/","");
- return addSequence(seq, filename);
+ URL url = (new URI(midiFileUrl)).toURL();
+ return addSequence(MidiSystem.getSequence(url), url.getFile().replaceFirst("^.*/",""));
}
/**
- * é\81¸æ\8a\9eã\81\97たシーケンスを除去します。
- * @param listSelectionModel 選択状態
+ * é\81¸æ\8a\9eã\81\95ã\82\8cたシーケンスを除去します。
+ * 除去されたシーケンスがシーケンサーにロード済みの場合、アンロードします。
*/
public void removeSelectedSequence() {
- if( sequenceListSelectionModel.isSelectionEmpty() )
- return;
+ if( sequenceListSelectionModel.isSelectionEmpty() ) return;
int selectedIndex = sequenceListSelectionModel.getMinSelectionIndex();
- if( sequenceList.remove(selectedIndex).isOnSequencer() ) {
- // 削除したシーケンスが
- // シーケンサーにロード済みだった場合、アンロードする。
+ if( sequenceList.remove(selectedIndex).isOnSequencer() )
sequencerModel.setSequenceTrackListTableModel(null);
- }
fireTableRowsDeleted(selectedIndex, selectedIndex);
}
/**
* 指定したインデックス位置のシーケンスをシーケンサーにロードします。
+ * すでに同じIDのシーケンスがロードされていた場合はスキップします。
* @param index シーケンスのインデックス位置(-1 を指定するとアンロードされます)
*/
public void loadToSequencer(int index) {
SequenceTrackListTableModel oldSeq = sequencerModel.getSequenceTrackListTableModel();
SequenceTrackListTableModel newSeq = (index < 0 ? null : sequenceList.get(index));
- if(oldSeq == newSeq)
- return;
+ if(oldSeq == newSeq) return;
sequencerModel.setSequenceTrackListTableModel(newSeq);
+ //
+ // 変更点をテーブルビューに通知して再表示してもらう
int columnIndices[] = {
Column.PLAY.ordinal(),
Column.POSITION.ordinal(),
};
if( oldSeq != null ) {
int oldIndex = sequenceList.indexOf(oldSeq);
- for( int columnIndex : columnIndices )
- fireTableCellUpdated(oldIndex, columnIndex);
+ for( int columnIndex : columnIndices ) fireTableCellUpdated(oldIndex, columnIndex);
}
if( newSeq != null ) {
- for( int columnIndex : columnIndices )
- fireTableCellUpdated(index, columnIndex);
+ for( int columnIndex : columnIndices ) fireTableCellUpdated(index, columnIndex);
}
}
/**
public boolean loadNext(int offset) {
int loadedIndex = indexOfSequenceOnSequencer();
int index = (loadedIndex < 0 ? 0 : loadedIndex + offset);
- if( index < 0 || index >= sequenceList.size() )
- return false;
+ if( index < 0 || index >= sequenceList.size() ) return false;
loadToSequencer(index);
return true;
}
-}
\ No newline at end of file
+}