OSDN Git Service

・シーケンス削除後プレイリストが空になるときIndexOB例外が発生していた問題の修正
authorAkiyoshi Kamide <kamide@yk.rim.or.jp>
Mon, 8 Jan 2018 14:42:07 +0000 (23:42 +0900)
committerAkiyoshi Kamide <kamide@yk.rim.or.jp>
Mon, 8 Jan 2018 14:42:07 +0000 (23:42 +0900)
・表選択インデックス周りのリファクタリング

src/camidion/chordhelper/ChordHelperApplet.java
src/camidion/chordhelper/MidiChordHelper.java
src/camidion/chordhelper/midieditor/MidiEventTable.java
src/camidion/chordhelper/midieditor/MidiSequenceEditorDialog.java
src/camidion/chordhelper/midieditor/PlaylistTable.java
src/camidion/chordhelper/midieditor/PlaylistTableModel.java
src/camidion/chordhelper/midieditor/SequenceTrackListTable.java

index 3701b2e..bf65105 100644 (file)
@@ -266,8 +266,8 @@ public class ChordHelperApplet extends JApplet {
         */
        public static class VersionInfo {
                public static final String NAME = "MIDI Chord Helper";
-               public static final String VERSION = "Ver.20170930.1";
-               public static final String COPYRIGHT = "Copyright (C) 2004-2017";
+               public static final String VERSION = "Ver.20180108.1";
+               public static final String COPYRIGHT = "Copyright (C) 2004-2018";
                public static final String AUTHER = "@きよし - Akiyoshi Kamide";
                public static final String URL = "http://www.yk.rim.or.jp/~kamide/music/chordhelper/";
        }
index e738517..49e368b 100644 (file)
@@ -70,7 +70,7 @@ public class MidiChordHelper extends JFrame implements AppletStub, AppletContext
                setTitle(titleOf(sequencer.getSequenceTrackListTableModel()));
        }
        private MidiChordHelper(List<File> fileList) {
-               setTitle(ChordHelperApplet.VersionInfo.NAME);
+               setTitle(titleOf(null));
                JLabel startingLabel = new JLabel(
                        "<html>"
                        +"<div width=300 height=50 style='font-size: 120%; font-style: italic; text-align: center;'>"
index 3dbf94b..d758e20 100644 (file)
@@ -198,7 +198,7 @@ public class MidiEventTable extends JTable {
                        eventDialog.midiMessageForm.durationForm.setPPQ(ppq);
                        tickPositionModel.setSequenceIndex(sequenceTableModel.getSequenceTickIndex());
 
-                       selectedIndex = selectionModel.getMinSelectionIndex();
+                       selectedIndex = getSelectedRow();
                        selectedMidiEvent = selectedIndex < 0 ? null : trackModel.getMidiEvent(selectedIndex);
                        currentTick = selectedMidiEvent == null ? 0 : selectedMidiEvent.getTick();
                        tickPositionModel.setTickPosition(currentTick);
index a8b08f6..e648e2d 100644 (file)
@@ -120,7 +120,7 @@ public class MidiSequenceEditorDialog extends JDialog {
         * すでに再生されていた場合、このエディタダイアログを表示します。
         */
        public void play() {
-               play(playlistTable.getSelectionModel().getMinSelectionIndex());
+               play(playlistTable.getSelectedRow());
        }
 
        static final Icon deleteIcon = new ButtonIcon(ButtonIcon.X_ICON);
index c91496c..b22a88f 100644 (file)
@@ -62,10 +62,10 @@ public class PlaylistTable extends JTable {
         * @return 選択されたMIDIシーケンスのテーブルモデル(非選択時はnull)
         */
        private SequenceTrackListTableModel getSelectedSequenceModel() {
-               if( selectionModel.isSelectionEmpty() ) return null;
-               int selectedIndex = selectionModel.getMinSelectionIndex();
+               int i = getSelectedRow();
+               if( i < 0 ) return null;
                List<SequenceTrackListTableModel> list = getModel().getSequenceModelList();
-               return selectedIndex >= list.size() ? null : list.get(selectedIndex);
+               return i >= list.size() ? null : list.get(i);
        }
        /**
         * 行が選択されているときだけイネーブルになるアクション
@@ -83,8 +83,7 @@ public class PlaylistTable extends JTable {
                        setEnebledBySelection();
                }
                protected void setEnebledBySelection() {
-                       int index = selectionModel.getMinSelectionIndex();
-                       setEnabled(index >= 0);
+                       setEnabled(getSelectedRow() >= 0);
                }
                private void init(String tooltip) {
                        putValue(Action.SHORT_DESCRIPTION, tooltip);
@@ -373,10 +372,15 @@ public class PlaylistTable extends JTable {
                        "選択したMIDIシーケンスはまだ保存されていません。プレイリストから削除しますか?";
                @Override
                public void actionPerformed(ActionEvent event) {
+                       int index = getSelectedRow();
+                       if( index < 0 ) return;
                        PlaylistTableModel model = getModel();
+                       List<SequenceTrackListTableModel> list = model.getSequenceModelList();
+                       if( index >= list.size() ) return;
+                       SequenceTrackListTableModel sequenceModel = list.get(index);
+                       if( sequenceModel == null ) return;
                        if( midiFileChooser != null ) {
-                               SequenceTrackListTableModel sequenceModel = getSelectedSequenceModel();
-                               if( sequenceModel != null && sequenceModel.isModified() && JOptionPane.showConfirmDialog(
+                               if( sequenceModel.isModified() && JOptionPane.showConfirmDialog(
                                                ((JComponent)event.getSource()).getRootPane(),
                                                CONFIRM_MESSAGE,
                                                ChordHelperApplet.VersionInfo.NAME,
@@ -384,8 +388,8 @@ public class PlaylistTable extends JTable {
                                                JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION
                                ) return;
                        }
-                       if( ! selectionModel.isSelectionEmpty() ) try {
-                               model.remove(selectionModel.getMinSelectionIndex());
+                       try {
+                               model.remove(index);
                        } catch (Exception ex) {
                                JOptionPane.showMessageDialog(
                                                ((JComponent)event.getSource()).getRootPane(), ex,
index 7d04651..2ec0a2f 100644 (file)
@@ -294,7 +294,7 @@ public class PlaylistTableModel extends AbstractTableModel {
                if( column != null && ! column.isChanged(event) ) return false;
                SequenceTrackListTableModel loadedSequence = sequencerModel.getSequenceTrackListTableModel();
                return loadedSequence != null && IntStream.rangeClosed(event.getFirstRow(), event.getLastRow())
-                       .anyMatch( index -> index != TableModelEvent.HEADER_ROW && sequenceModelList.get(index) == loadedSequence );
+                               .anyMatch( i -> i >= 0 && i < sequenceModelList.size() && sequenceModelList.get(i) == loadedSequence );
        }
        /**
         * [row, column]にあるセルの値が更新されたことを、すべてのリスナーに通知します。
index 65bf5d7..9c70923 100644 (file)
@@ -80,7 +80,7 @@ public class SequenceTrackListTable extends JTable {
                        if( event.getValueIsAdjusting() ) return;
                        deleteTrackAction.setEnabled(! selectionModel.isSelectionEmpty());
                        eventListTable.setModel(getModel().getSelectedTrackModel(selectionModel));
-                       eventListTable.titleLabel.showTrackNumber(selectionModel.getMinSelectionIndex());
+                       eventListTable.titleLabel.showTrackNumber(getSelectedRow());
                });
        }
        /**