OSDN Git Service

・コードダイアグラム周りの改善
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / ChordDisplayLabel.java
1 package camidion.chordhelper;
2
3 import java.awt.Color;
4 import java.awt.Dimension;
5 import java.awt.Graphics;
6 import java.awt.event.InputEvent;
7 import java.awt.event.MouseAdapter;
8 import java.awt.event.MouseEvent;
9
10 import javax.swing.JLabel;
11
12 import camidion.chordhelper.chordmatrix.ChordMatrix;
13 import camidion.chordhelper.music.Chord;
14 import camidion.chordhelper.music.MIDISpec;
15 import camidion.chordhelper.music.Note;
16 import camidion.chordhelper.pianokeyboard.PianoKeyboard;
17
18 /**
19  * 和音表示ラベル
20  */
21 public class ChordDisplayLabel extends JLabel {
22         private String defaultString = null;
23         private Chord chord = null;
24         private int noteNumber = -1;
25         private boolean isDark = false;
26         private boolean isMouseEntered = false;
27         /**
28          * 和音表示ラベルを構築します。
29          * @param defaultString 初期表示する文字列
30          * @param chordMatrix このラベルをクリックしたときに鳴らす和音ボタンマトリクス
31          * @param keyboard このラベルをクリックしたときに鳴らす鍵盤
32          */
33         public ChordDisplayLabel(String defaultString, ChordMatrix chordMatrix, PianoKeyboard keyboard) {
34                 super(defaultString, JLabel.CENTER);
35                 this.defaultString = defaultString;
36                 if( chordMatrix == null ) return;
37                 addMouseListener(new MouseAdapter() {
38                         @Override
39                         public void mousePressed(MouseEvent e) {
40                                 if( chord != null ) { // コードが表示されている場合
41                                         if( (e.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0 ) {
42                                                 // 右クリックでコードを止める
43                                                 chordMatrix.setSelectedChord((Chord)null);
44                                         }
45                                         else {
46                                                 // コードを鳴らす。
47                                                 //   キーボードが指定されている場合、オリジナルキー(カポ反映済)のコードを使う。
48                                                 if( keyboard == null )
49                                                         chordMatrix.setSelectedChord(chord);
50                                                 else
51                                                         chordMatrix.setSelectedChordCapo(chord);
52                                         }
53                                 }
54                                 else if( noteNumber >= 0 ) { // 音階が表示されている場合
55                                         keyboard.noteOn(noteNumber);
56                                 }
57                         }
58                         @Override
59                         public void mouseReleased(MouseEvent e) {
60                                 if( noteNumber >= 0 ) keyboard.noteOff(noteNumber);
61                         }
62                         @Override
63                         public void mouseEntered(MouseEvent e) { mouseEntered(true); }
64                         @Override
65                         public void mouseExited(MouseEvent e) { mouseEntered(false); }
66                         private void mouseEntered(boolean isMouseEntered) {
67                                 ChordDisplayLabel.this.isMouseEntered = isMouseEntered;
68                                 if( noteNumber >= 0 || chord != null ) repaint();
69                         }
70                 });
71                 addMouseWheelListener(chordMatrix);
72         }
73         @Override
74         public void paint(Graphics g) {
75                 super.paint(g);
76                 Dimension d = getSize();
77                 if( isMouseEntered && (noteNumber >= 0 || chord != null) ) {
78                         g.setColor(Color.gray);
79                         g.drawRect( 0, 0, d.width-1, d.height-1 );
80                 }
81         }
82         /**
83          * 音階を表示します。
84          * @param noteNumber MIDIノート番号
85          * @param isRhythmPart リズムパートのときtrue
86          */
87         public void setNote(int noteNumber, boolean isRhythmPart) {
88                 setToolTipText(null);
89                 this.chord = null;
90                 if( (this.noteNumber = noteNumber) < 0 ) {
91                         setText(defaultString);
92                         return;
93                 }
94                 if( isRhythmPart ) {
95                         String pn = MIDISpec.getPercussionName(noteNumber);
96                         setText("MIDI note No." + noteNumber + " : " + pn);
97                 }
98                 else {
99                         String ns = Note.noteNumberToSymbol(noteNumber);
100                         double f = MIDISpec.noteNumberToFrequency(noteNumber);
101                         setText("Note: "+ns+"  -  MIDI note No."+noteNumber+" : "+Math.round(f)+"Hz");
102                 }
103         }
104         /**
105          * 和音(コード名)を表示します。
106          * @param chord 和音
107          */
108         public void setChord(Chord chord) {
109                 this.noteNumber = -1;
110                 if( (this.chord = chord) == null ) {
111                         setText(defaultString);
112                         setToolTipText(null);
113                 }
114                 else {
115                         setChordText();
116                         setToolTipText("Chord: "+chord.toName());
117                 }
118         }
119         /**
120          * 表示をクリアします。
121          */
122         public void clear() { setNote(-1, false); }
123         /**
124          * ダークモードのON/OFFを切り替えます。
125          * @param isDark ダークモードONのときtrue
126          */
127         public void setDarkMode(boolean isDark) {
128                 this.isDark = isDark;
129                 if( chord != null ) setChordText();
130         }
131         private void setChordText() {
132                 setText(chord.toHtmlString(isDark ? "#FFCC33" : "maroon"));
133         }
134 }