1 package camidion.chordhelper.midieditor;
\r
2 import java.awt.Dimension;
\r
3 import java.awt.event.ActionEvent;
\r
4 import java.io.IOException;
\r
5 import java.util.regex.Pattern;
\r
7 import javax.sound.midi.InvalidMidiDataException;
\r
8 import javax.swing.AbstractAction;
\r
9 import javax.swing.Action;
\r
10 import javax.swing.Box;
\r
11 import javax.swing.BoxLayout;
\r
12 import javax.swing.JButton;
\r
13 import javax.swing.JDialog;
\r
14 import javax.swing.JLabel;
\r
15 import javax.swing.JOptionPane;
\r
16 import javax.swing.JPanel;
\r
17 import javax.swing.JScrollPane;
\r
18 import javax.swing.JTextArea;
\r
20 import org.apache.commons.codec.binary.Base64;
\r
22 import camidion.chordhelper.ButtonIcon;
\r
23 import camidion.chordhelper.ChordHelperApplet;
\r
28 public class Base64Dialog extends JDialog {
\r
29 private Base64TextArea base64TextArea = new Base64TextArea(8,56);
\r
30 private MidiEditor midiEditor;
\r
34 public Action addBase64Action = new AbstractAction(
\r
35 "Base64 Decode & Add to PlayList",
\r
36 new ButtonIcon(ButtonIcon.EJECT_ICON)
\r
40 Action.SHORT_DESCRIPTION,
\r
41 "Base64デコードして、プレイリストへ追加"
\r
45 public void actionPerformed(ActionEvent event) {
\r
46 byte[] data = getMIDIData();
\r
47 if( data == null || data.length == 0 ) {
\r
48 String message = "No data entered - データが入力されていません。";
\r
49 JOptionPane.showMessageDialog(
\r
50 Base64Dialog.this, message,
\r
51 ChordHelperApplet.VersionInfo.NAME,
\r
52 JOptionPane.WARNING_MESSAGE
\r
54 base64TextArea.requestFocusInWindow();
\r
57 PlaylistTableModel sltm = midiEditor.sequenceListTable.getModel();
\r
59 sltm.addSequence(data, null);
\r
60 } catch(IOException | InvalidMidiDataException e) {
\r
61 String message = "例外 "+e+" が発生しました。"+e.getMessage();
\r
62 e.printStackTrace();
\r
63 midiEditor.showWarning(message);
\r
64 base64TextArea.requestFocusInWindow();
\r
71 * Base64テキストクリアアクション
\r
73 public Action clearAction = new AbstractAction("Clear") {
\r
75 public void actionPerformed(ActionEvent e) {
\r
76 base64TextArea.setText(null);
\r
79 private static class Base64TextArea extends JTextArea {
\r
80 private static final Pattern headerLine =
\r
81 Pattern.compile( "^.*:.*$", Pattern.MULTILINE );
\r
82 public Base64TextArea(int rows, int columns) {
\r
83 super(rows,columns);
\r
85 public byte[] getBinary() {
\r
86 String text = headerLine.matcher(getText()).replaceAll("");
\r
87 return Base64.decodeBase64(text.getBytes());
\r
89 public void setBinary(byte[] binary_data, String content_type, String filename) {
\r
90 if( binary_data != null && binary_data.length > 0 ) {
\r
92 if( content_type != null && filename != null ) {
\r
93 header += "Content-Type: " + content_type + "; name=\"" + filename + "\"\n";
\r
94 header += "Content-Transfer-Encoding: base64\n";
\r
97 setText(header + new String(Base64.encodeBase64Chunked(binary_data)) + "\n");
\r
102 * Base64テキスト入力ダイアログを構築します。
\r
103 * @param midiEditor 親画面となるMIDIエディタ
\r
105 public Base64Dialog(MidiEditor midiEditor) {
\r
106 this.midiEditor = midiEditor;
\r
107 setTitle("Base64-encoded MIDI sequence - " + ChordHelperApplet.VersionInfo.NAME);
\r
109 Base64.decodeBase64("".getBytes());
\r
110 base64Available = true;
\r
111 } catch( NoClassDefFoundError e ) {
\r
112 base64Available = false;
\r
114 if( base64Available ) {
\r
115 add(new JPanel() {{
\r
116 setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
\r
117 add(new JPanel() {{
\r
118 setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
\r
119 add(new JLabel("Base64-encoded MIDI sequence:"));
\r
120 add(Box.createRigidArea(new Dimension(10, 0)));
\r
121 add(new JButton(addBase64Action){{setMargin(ChordHelperApplet.ZERO_INSETS);}});
\r
122 add(new JButton(clearAction){{setMargin(ChordHelperApplet.ZERO_INSETS);}});
\r
124 add(new JScrollPane(base64TextArea));
\r
127 setBounds( 300, 250, 660, 300 );
\r
129 private boolean base64Available;
\r
131 * {@link Base64} が使用できるかどうかを返します。
\r
132 * @return Apache Commons Codec ライブラリが利用できる状態ならtrue
\r
134 public boolean isBase64Available() {
\r
135 return base64Available;
\r
138 * バイナリー形式でMIDIデータを返します。
\r
139 * @return バイナリー形式のMIDIデータ
\r
141 public byte[] getMIDIData() {
\r
142 return base64TextArea.getBinary();
\r
145 * バイナリー形式のMIDIデータを設定します。
\r
146 * @param midiData バイナリー形式のMIDIデータ
\r
148 public void setMIDIData( byte[] midiData ) {
\r
149 base64TextArea.setBinary(midiData, null, null);
\r
152 * バイナリー形式のMIDIデータを、ファイル名をつけて設定します。
\r
153 * @param midiData バイナリー形式のMIDIデータ
\r
154 * @param filename ファイル名
\r
156 public void setMIDIData( byte[] midiData, String filename ) {
\r
157 base64TextArea.setBinary(midiData, "audio/midi", filename);
\r
158 base64TextArea.selectAll();
\r
161 * Base64形式でMIDIデータを返します。
\r
162 * @return Base64形式のMIDIデータ
\r
164 public String getBase64Data() {
\r
165 return base64TextArea.getText();
\r
168 * Base64形式のMIDIデータを設定します。
\r
169 * @param base64Data Base64形式のMIDIデータ
\r
171 public void setBase64Data( String base64Data ) {
\r
172 base64TextArea.setText(null);
\r
173 base64TextArea.append(base64Data);
\r