From: Akiyoshi Kamide Date: Wed, 4 Dec 2013 16:47:31 +0000 (+0000) Subject: イベント編集ウィンドウ初期サイズがWindows7で小さすぎたので再調整 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=39b9f54127beeef2f752e77bef2874215a5d6544;p=midichordhelper%2FMIDIChordHelper.git イベント編集ウィンドウ初期サイズがWindows7で小さすぎたので再調整 git-svn-id: https://svn.sourceforge.jp/svnroot/midichordhelper/MIDIChordHelper@22 302f1594-2db2-43b1-aaa4-6307b5a2a2de --- diff --git a/src/ChordHelperApplet.java b/src/ChordHelperApplet.java index 692068a..4cebe66 100644 --- a/src/ChordHelperApplet.java +++ b/src/ChordHelperApplet.java @@ -268,7 +268,7 @@ public class ChordHelperApplet extends JApplet { */ public static class VersionInfo { public static final String NAME = "MIDI Chord Helper"; - public static final String VERSION = "Ver.20131204.2"; + public static final String VERSION = "Ver.20131205.1"; public static final String COPYRIGHT = "Copyright (C) 2004-2013"; public static final String AUTHER = "@きよし - Akiyoshi Kamide"; public static final String URL = "http://www.yk.rim.or.jp/~kamide/music/chordhelper/"; diff --git a/src/MIDIEditor.java b/src/MIDIEditor.java index fd69a3d..ff9f50b 100644 --- a/src/MIDIEditor.java +++ b/src/MIDIEditor.java @@ -475,8 +475,7 @@ class MidiEditor extends JDialog implements DropTargetListener { public TrackListTable(SequenceTrackListTableModel model) { super(model, null, model.trackListSelectionModel); // - // 録音対象のMIDIチャンネルをコンボボックスで選択できるよう、 - // 列モデルにセルエディタを設定 + // 録音対象のMIDIチャンネルをコンボボックスで選択できるようにする int colIndex = SequenceTrackListTableModel.Column.RECORD_CHANNEL.ordinal(); TableColumn tc = getColumnModel().getColumn(colIndex); tc.setCellEditor(new DefaultCellEditor(new JComboBox(){{ @@ -823,7 +822,7 @@ class MidiEditor extends JDialog implements DropTargetListener { setSelectedEvent(); midiEventsToBeOverwritten = null; // 追加なので、上書きされるイベントなし eventDialog.setTitle("Add a new MIDI event"); - eventDialog.okButton.setAction(eventCellEditor.addEventAction); + eventDialog.okButton.setAction(eventCellEditor.applyEventAction); int ch = getModel().getChannel(); if( ch >= 0 ) { eventDialog.midiMessageForm.channelText.setSelectedChannel(ch); @@ -895,45 +894,6 @@ class MidiEditor extends JDialog implements DropTargetListener { } }; /** - * イベント編集アクション - */ - private Action editEventAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - setSelectedEvent(); - if( selectedMidiEvent == null ) - return; - MidiEvent partnerEvent = null; - eventDialog.midiMessageForm.setMessage(selectedMidiEvent.getMessage()); - if( eventDialog.midiMessageForm.isNote() ) { - int partnerIndex = getModel().getIndexOfPartnerFor(selectedIndex); - if( partnerIndex < 0 ) { - eventDialog.midiMessageForm.durationForm.setDuration(0); - } - else { - partnerEvent = getModel().getMidiEvent(partnerIndex); - long partnerTick = partnerEvent.getTick(); - long duration = currentTick > partnerTick ? - currentTick - partnerTick : partnerTick - currentTick ; - eventDialog.midiMessageForm.durationForm.setDuration((int)duration); - } - } - MidiEvent events[]; - if( partnerEvent == null ) { - events = new MidiEvent[1]; - events[0] = selectedMidiEvent; - } - else { - events = new MidiEvent[2]; - events[0] = selectedMidiEvent; - events[1] = partnerEvent; - } - midiEventsToBeOverwritten = events; - eventDialog.setTitle("Change MIDI event"); - eventDialog.okButton.setAction(eventCellEditor.addEventAction); - eventDialog.openEventForm(); - } - }; - /** * MIDIイベント表のセルエディタ */ private MidiEventCellEditor eventCellEditor; @@ -942,36 +902,65 @@ class MidiEditor extends JDialog implements DropTargetListener { */ class MidiEventCellEditor extends AbstractCellEditor implements TableCellEditor { /** - * イベント入力をキャンセルするアクション + * MIDIイベントセルエディタを構築します。 */ - Action cancelAction = new AbstractAction() { - { - putValue(NAME,"Cancel"); - eventDialog.cancelButton.setAction(this); - } - public void actionPerformed(ActionEvent e) { - fireEditingCanceled(); - eventDialog.setVisible(false); - } - }; public MidiEventCellEditor() { eventDialog.midiMessageForm.setOutputMidiChannels(virtualMidiDevice.getChannels()); eventDialog.tickPositionInputForm.setModel(tickPositionModel); int index = TrackEventListTableModel.Column.MESSAGE.ordinal(); getColumnModel().getColumn(index).setCellEditor(this); } + /** + * セルをダブルクリックしないと編集できないようにします。 + * @param e イベント(マウスイベント) + * @return 編集可能になったらtrue + */ @Override public boolean isCellEditable(EventObject e) { - // ダブルクリックで編集 - return e instanceof MouseEvent && ((MouseEvent)e).getClickCount() == 2; + if( ! (e instanceof MouseEvent) ) return false; + return ((MouseEvent)e).getClickCount() == 2; } @Override public Object getCellEditorValue() { return ""; } - private JButton editEventButton = new JButton(editEventAction){ - { - setHorizontalAlignment(JButton.LEFT); + /** + * 既存イベントを編集するアクション + */ + private Action editEventAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + setSelectedEvent(); + if( selectedMidiEvent == null ) + return; + MidiEvent partnerEvent = null; + eventDialog.midiMessageForm.setMessage(selectedMidiEvent.getMessage()); + if( eventDialog.midiMessageForm.isNote() ) { + int partnerIndex = getModel().getIndexOfPartnerFor(selectedIndex); + if( partnerIndex < 0 ) { + eventDialog.midiMessageForm.durationForm.setDuration(0); + } + else { + partnerEvent = getModel().getMidiEvent(partnerIndex); + long partnerTick = partnerEvent.getTick(); + long duration = currentTick > partnerTick ? + currentTick - partnerTick : partnerTick - currentTick ; + eventDialog.midiMessageForm.durationForm.setDuration((int)duration); + } + } + if(partnerEvent == null) + midiEventsToBeOverwritten = new MidiEvent[] {selectedMidiEvent}; + else + midiEventsToBeOverwritten = new MidiEvent[] {selectedMidiEvent, partnerEvent}; + eventDialog.setTitle("Change MIDI event"); + eventDialog.okButton.setAction(applyEventAction); + eventDialog.cancelButton.addActionListener(cancelActionListener); + eventDialog.openEventForm(); } }; + /** + * イベント編集ボタン + */ + private JButton editEventButton = new JButton(editEventAction){{ + setHorizontalAlignment(JButton.LEFT); + }}; @Override public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column @@ -980,10 +969,27 @@ class MidiEditor extends JDialog implements DropTargetListener { return editEventButton; } /** - * イベントの追加(または変更)を行うアクション + * イベント入力をキャンセルするアクションリスナーです。 + * + *

セル編集によって表示されたMIDIメッセージダイアログを + * キャンセルする場合、セル編集を中止する処理の追加が必要です。 + * その追加処理をこのリスナーでカバーします。 + *

*/ - private Action addEventAction = new AbstractAction() { - { putValue(NAME,"OK"); } + private ActionListener cancelActionListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + fireEditingCanceled(); + // 用が済んだら当リスナーを除去 + eventDialog.cancelButton.removeActionListener(this); + } + }; + /** + * 入力したイベントを反映するアクション + */ + private Action applyEventAction = new AbstractAction() { + { + putValue(NAME,"OK"); + } public void actionPerformed(ActionEvent e) { long tick = tickPositionModel.getTickPosition(); MidiMessage msg = eventDialog.midiMessageForm.getMessage(); diff --git a/src/MIDIMsgForm.java b/src/MIDIMsgForm.java index 7be1668..9a31b8e 100644 --- a/src/MIDIMsgForm.java +++ b/src/MIDIMsgForm.java @@ -55,8 +55,7 @@ import javax.swing.event.ListSelectionListener; * Copyright (C) 2006-2013 @きよし - Akiyoshi Kamide * http://www.yk.rim.or.jp/~kamide/music/chordhelper/ */ -class MidiEventDialog extends JDialog implements ActionListener { - MidiMessageForm midiMessageForm = new MidiMessageForm(); +class MidiEventDialog extends JDialog { /** * tick位置入力フォーム */ @@ -85,37 +84,57 @@ class MidiEventDialog extends JDialog implements ActionListener { extraTickSpinner.setModel(model.extraTickModel); } } - TickPositionInputForm tickPositionInputForm = new TickPositionInputForm(); - JButton okButton = new JButton("OK"); - JButton cancelButton = new JButton("Cancel"); + /** + * tick位置入力フォーム + */ + TickPositionInputForm tickPositionInputForm; + /** + * MIDIメッセージ入力フォーム + */ + MidiMessageForm midiMessageForm; + /** + * キャンセルボタン + */ + JButton cancelButton; + /** + * OKボタン(アクションによってラベルがOK以外に変わることがある) + */ + JButton okButton; + /** + * MIDIイベントダイアログの構築 + */ public MidiEventDialog() { setLayout(new FlowLayout()); - add(tickPositionInputForm); - add(midiMessageForm); - add(new JPanel(){{add(okButton); add(cancelButton);}}); - cancelButton.addActionListener(this); - } - public void actionPerformed(ActionEvent e) { - setVisible(false); + add(tickPositionInputForm = new TickPositionInputForm()); + add(midiMessageForm = new MidiMessageForm()); + add(new JPanel(){{ + add(okButton = new JButton("OK")); + add(cancelButton = new JButton("Cancel")); + }}); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); } public void openTickForm() { tickPositionInputForm.setVisible(true); midiMessageForm.setVisible(false); - setBounds( 200, 300, 500, 120 ); + setBounds( 200, 300, 520, 150 ); setVisible(true); } public void openEventForm() { tickPositionInputForm.setVisible(true); midiMessageForm.setVisible(true); midiMessageForm.setDurationVisible(true); - setBounds( 200, 300, 630, 320 ); + setBounds( 200, 300, 630, 370 ); setVisible(true); } public void openMessageForm() { tickPositionInputForm.setVisible(false); midiMessageForm.setVisible(true); midiMessageForm.setDurationVisible(false); - setBounds( 200, 300, 630, 270 ); + setBounds( 200, 300, 630, 300 ); setVisible(true); } } @@ -399,19 +418,37 @@ class MidiMessageForm extends JPanel implements ActionListener { } updateVisible(); } - // - // Methods - // - public void setOutputMidiChannels( MidiChannel midi_channels[] ) { - this.midiChannels = midi_channels; + /** + * このMIDIメッセージフォームにMIDIチャンネルを設定します。 + * + *

設定したMIDIチャンネルには、 + * ダイアログ内のピアノキーボードで音階を入力したときに + * ノートON/OFFが出力されます。これにより実際に音として聞けるようになります。 + *

+ * + * @param midiChannels MIDIチャンネル + */ + public void setOutputMidiChannels( MidiChannel midiChannels[] ) { + this.midiChannels = midiChannels; } - public void setDurationVisible(boolean is_visible) { - isDurationVisible = is_visible; + /** + * 時間間隔入力の表示状態を変更します。 + * @param isVisible trueで表示、falseで非表示 + */ + public void setDurationVisible(boolean isVisible) { + isDurationVisible = isVisible; updateVisible(); } + /** + * 時間間隔入力の表示状態を返します。 + * @return true:表示中 false:非表示中 + */ public boolean isDurationVisible() { return isDurationVisible; } + /** + * 各入力欄の表示状態を更新します。 + */ public void updateVisible() { int msgStatus = statusText.getValue(); boolean is_ch_msg = MIDISpec.isChannelMessage(msgStatus); @@ -503,6 +540,10 @@ class MidiMessageForm extends JPanel implements ActionListener { break; } } + /** + * 入力している内容からMIDIメッセージを生成して返します。 + * @return 入力している内容から生成したMIDIメッセージ + */ public MidiMessage getMessage() { int msg_status = statusText.getValue(); if( msg_status < 0 ) { @@ -569,6 +610,10 @@ class MidiMessageForm extends JPanel implements ActionListener { } return (MidiMessage)msg; } + /** + * MIDIメッセージを入力欄に反映します。 + * @param msg MIDIメッセージ + */ public void setMessage( MidiMessage msg ) { if( msg instanceof ShortMessage ) { ShortMessage smsg = (ShortMessage)msg; @@ -628,13 +673,13 @@ class MidiMessageForm extends JPanel implements ActionListener { public boolean isNote( boolean note_on, int status ) { int cmd = status & 0xF0; return ( - note_on && cmd == ShortMessage.NOTE_ON && data2Text.getValue() > 0 - || - !note_on && ( - cmd == ShortMessage.NOTE_ON && data2Text.getValue() <= 0 || - cmd == ShortMessage.NOTE_OFF - ) - ); + note_on && cmd == ShortMessage.NOTE_ON && data2Text.getValue() > 0 + || + !note_on && ( + cmd == ShortMessage.NOTE_ON && data2Text.getValue() <= 0 || + cmd == ShortMessage.NOTE_OFF + ) + ); } public ShortMessage getPartnerMessage() { ShortMessage sm = (ShortMessage)getMessage();