OSDN Git Service

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