*/
public boolean isPlaying() { return isRunning(); }
/**
- * 現在シーケンサにロードされているMIDIデータを
- * Base64テキストに変換した結果を返します。
- * @return MIDIデータをBase64テキストに変換した結果
+ * 現在シーケンサにロードされているMIDIデータをBase64テキストに変換した結果を返します。
+ * @return MIDIデータをBase64テキストに変換した結果(シーケンサにロードされていない場合null)
* @throws IOException MIDIデータの読み込みに失敗した場合
*/
public String getMidiDataBase64() throws IOException {
- SequenceTrackListTableModel sequenceModel = sequencerModel.getSequenceTrackListTableModel();
+ SequenceTrackListTableModel s = sequencerModel.getSequenceTrackListTableModel();
+ if( s == null ) return null;
Base64Dialog d = midiEditor.base64Dialog;
- d.setMIDIData(sequenceModel.getMIDIdata());
+ d.setMIDIData(s.getMIDIdata());
return d.getBase64Data();
}
/**
* 現在シーケンサにロードされているMIDIファイルのファイル名を返します。
- * @return MIDIファイル名(設定されていないときは空文字列)
+ * @return MIDIファイル名(設定されていないときは空文字列、シーケンサにロードされていない場合null)
*/
public String getMidiFilename() {
SequenceTrackListTableModel s = sequencerModel.getSequenceTrackListTableModel();
*/
public static class VersionInfo {
public static final String NAME = "MIDI Chord Helper";
- public static final String VERSION = "Ver.20170408.1";
+ public static final String VERSION = "Ver.20170409.1";
public static final String COPYRIGHT = "Copyright (C) 2004-2017";
public static final String AUTHER = "@きよし - Akiyoshi Kamide";
public static final String URL = "http://www.yk.rim.or.jp/~kamide/music/chordhelper/";
*/
public static final Insets ZERO_INSETS = new Insets(0,0,0,0);
- // GUIコンポーネント
+ // GUIコンポーネント(Javaアプリメインからの参照用)
MidiSequenceEditorDialog midiEditor;
PlaylistTableModel playlistModel;
- MidiSequencerModel sequencerModel;
+
+ // GUIコンポーネント(内部保存用)
+ private MidiSequencerModel sequencerModel;
private ChordMatrix chordMatrix;
private JPanel keyboardSequencerPanel;
private JPanel chordGuide;
private ImageIcon imageIcon;
public ImageIcon getImageIcon() { return imageIcon; }
+ @Override
public void init() {
// アイコン画像のロード
URL imageIconUrl = getClass().getResource("midichordhelper.png");
import javax.swing.WindowConstants;
import javax.swing.event.TableModelEvent;
+import camidion.chordhelper.mididevice.MidiSequencerModel;
import camidion.chordhelper.midieditor.PlaylistTableModel;
import camidion.chordhelper.midieditor.SequenceTrackListTableModel;
private JLabel status_ = new JLabel("Welcome to "+ChordHelperApplet.VersionInfo.NAME) {
{ setFont(getFont().deriveFont(Font.PLAIN)); }
};
- /**
- * 指定されたMIDIシーケンスモデルのファイル名をタイトルバーに反映します。
- * @param seq MIDIシーケンスモデル
- */
- private void setFilenameToTitle(SequenceTrackListTableModel seq) {
+ private void updateFilename(SequenceTrackListTableModel sequence) {
String title = ChordHelperApplet.VersionInfo.NAME;
- if( seq != null ) {
- String filename = seq.getFilename();
- if( filename != null && ! filename.isEmpty() ) title = filename + " - " + title;
+ if( sequence != null ) {
+ String filename = sequence.getFilename();
+ if( filename != null && ! filename.isEmpty() )
+ title = filename+" - "+title;
}
setTitle(title);
}
+ private void updateFilename(MidiSequencerModel sequencer) {
+ updateFilename(sequencer.getSequenceTrackListTableModel());
+ }
+ private void updateFilename(TableModelEvent event) {
+ if( ! PlaylistTableModel.filenameChanged(event) ) return;
+ updateFilename(((PlaylistTableModel)event.getSource()).getSequencerModel());
+ }
public AppletFrame(ChordHelperApplet applet, List<File> fileList) {
- setTitle(ChordHelperApplet.VersionInfo.NAME);
add( applet, BorderLayout.CENTER );
add( status_, BorderLayout.SOUTH );
applet.setStub(this);
applet.init();
setIconImage(applet.getIconImage());
- setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
pack();
setLocationRelativeTo(null);
- setVisible(true);
- applet.start();
+ setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent event) {
)) { applet.destroy(); System.exit(0); }
}
});
- // シーケンサで切り替わった再生対象ファイル名をタイトルバーに反映
- applet.sequencerModel.addChangeListener(e->setFilenameToTitle(applet.sequencerModel.getSequenceTrackListTableModel()));
- // プレイリスト上で変更された再生対象ファイル名をタイトルバーに反映
- applet.playlistModel.addTableModelListener(tme->{
- int col = tme.getColumn();
- if( col == PlaylistTableModel.Column.FILENAME.ordinal() || col == TableModelEvent.ALL_COLUMNS ) {
- setFilenameToTitle(applet.sequencerModel.getSequenceTrackListTableModel());
- }
- });
+ applet.playlistModel.getSequencerModel().addChangeListener(e->updateFilename((MidiSequencerModel)e.getSource()));
+ applet.playlistModel.addTableModelListener(e->updateFilename(e));
+ updateFilename(applet.playlistModel.getSequencerModel());
+ setVisible(true);
+ applet.start();
applet.midiEditor.play(fileList);
}
@Override
public void internalFrameDeactivated(InternalFrameEvent e) { repaint(); }
@Override
public void internalFrameClosing(InternalFrameEvent e) {
- JInternalFrame f = e.getInternalFrame();
- if( ! (f instanceof MidiDeviceFrame) ) return;
- MidiDeviceModel m = ((MidiDeviceFrame)f).getMidiDeviceModel();
- m.getMidiDevice().getReceivers().forEach(rx->rxToColor.remove(rx));
+ ((MidiDeviceFrame)e.getInternalFrame()).getMidiDeviceModel()
+ .getMidiDevice().getReceivers().forEach(rx->rxToColor.remove(rx));
repaint();
}
};
import javax.sound.midi.MidiUnavailableException;
import javax.swing.JDesktopPane;
-import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.TransferHandler;
return;
}
}
- JInternalFrame frame = getSelectedFrame();
- if( frame instanceof MidiDeviceFrame ) try {
- ((MidiDeviceFrame)frame).setSelected(false);
- } catch( PropertyVetoException ex ) {
+ try {
+ MidiDeviceFrame selectedFrame = (MidiDeviceFrame)getSelectedFrame();
+ if( selectedFrame != null ) selectedFrame.setSelected(false);
+ } catch( Exception ex ) {
ex.printStackTrace();
}
}
import javax.sound.midi.MidiDevice;
import javax.swing.JEditorPane;
-import javax.swing.JInternalFrame;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;
}
@Override
public void internalFrameActivated(InternalFrameEvent e) {
- JInternalFrame frame = e.getInternalFrame();
- if( ! (frame instanceof MidiDeviceFrame ) ) return;
- setText(treeNodeTextOf(((MidiDeviceFrame)frame).getMidiDeviceModel()));
+ setText(treeNodeTextOf(((MidiDeviceFrame)e.getInternalFrame()).getMidiDeviceModel()));
}
@Override
public void internalFrameClosing(InternalFrameEvent e) {
- JInternalFrame f = e.getInternalFrame();
- if( ! (f instanceof MidiDeviceFrame ) ) return;
- MidiDeviceModel m = ((MidiDeviceFrame)f).getMidiDeviceModel();
+ MidiDeviceFrame f = (MidiDeviceFrame)e.getInternalFrame();
+ MidiDeviceModel m = f.getMidiDeviceModel();
m.close();
// デバイスが閉じたことを確認してから画面を閉じる
if( ! m.getMidiDevice().isOpen() ) {
import camidion.chordhelper.ChordHelperApplet;
/**
- * 仮想MIDIデバイスを含めたすべてのMIDIデバイスモデル{@link MidiDeviceModel}をツリー構造で管理するモデル。
- * 読み取り専用のMIDIデバイスリストとしても、
- * I/Oタイプで分類されたMIDIデバイスツリーモデルとしても参照できます。
+ * 仮想MIDIデバイスを含めたすべてのMIDIデバイスモデル{@link MidiDeviceModel}をリスト構造、ツリー構造で管理するモデル。
+ * 読み取り専用のMIDIデバイスリストとしても、I/Oタイプで分類されたMIDIデバイスツリーモデルとしても参照できます。
*/
public class MidiDeviceTreeModel extends AbstractList<MidiDeviceModel> implements TreeModel {
@Override
import java.awt.datatransfer.Transferable;
import javax.swing.JComponent;
-import javax.swing.JInternalFrame;
import javax.swing.JTree;
import javax.swing.ToolTipManager;
import javax.swing.TransferHandler;
public final InternalFrameListener midiDeviceFrameListener = new InternalFrameAdapter() {
@Override
public void internalFrameActivated(InternalFrameEvent e) {
- JInternalFrame frame = e.getInternalFrame();
- if( ! (frame instanceof MidiDeviceFrame ) ) return;
// 選択されたフレームのツリーノードを選択
- setSelectionPath(((MidiDeviceFrame)frame).getMidiDeviceModel().getTreePath());
+ setSelectionPath(((MidiDeviceFrame)e.getInternalFrame()).getMidiDeviceModel().getTreePath());
}
@Override
public void internalFrameClosing(InternalFrameEvent e) {
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
+import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import camidion.chordhelper.ButtonIcon;
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
};
+ /**
+ * テーブルモデルの変更を示すイベントが、ファイル名の変更によるものかどうかをチェックします。
+ * @param event テーブルモデルの変更を示すイベント
+ * @return ファイル名の変更による場合true
+ */
+ public static boolean filenameChanged(TableModelEvent event) {
+ int c = event.getColumn();
+ return c == Column.FILENAME.ordinal() || c == TableModelEvent.ALL_COLUMNS ;
+ }
/** 再生中のシーケンサーの秒位置リスナー */
private ChangeListener mmssPosition = new ChangeListener() {
private int value = 0;