OSDN Git Service

97f3c369f6ec3c03c296eb5b28a309401dc12518
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / midieditor / Base64Dialog.java
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
6 \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
19 \r
20 import org.apache.commons.codec.binary.Base64;\r
21 \r
22 import camidion.chordhelper.ButtonIcon;\r
23 import camidion.chordhelper.ChordHelperApplet;\r
24 \r
25 /**\r
26  * Base64テキスト入力ダイアログ\r
27  */\r
28 public class Base64Dialog extends JDialog {\r
29         private Base64TextArea base64TextArea = new Base64TextArea(8,56);\r
30         private MidiEditor midiEditor;\r
31         /**\r
32          * Base64デコードアクション\r
33          */\r
34         public Action addBase64Action = new AbstractAction(\r
35                 "Base64 Decode & Add to PlayList",\r
36                 new ButtonIcon(ButtonIcon.EJECT_ICON)\r
37         ) {\r
38                 {\r
39                         putValue(\r
40                                 Action.SHORT_DESCRIPTION,\r
41                                 "Base64デコードして、プレイリストへ追加"\r
42                         );\r
43                 }\r
44                 @Override\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
53                                 );\r
54                                 base64TextArea.requestFocusInWindow();\r
55                                 return;\r
56                         }\r
57                         PlaylistTableModel sltm = midiEditor.sequenceListTable.getModel();\r
58                         try {\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
65                                 return;\r
66                         }\r
67                         setVisible(false);\r
68                 }\r
69         };\r
70         /**\r
71          * Base64テキストクリアアクション\r
72          */\r
73         public Action clearAction = new AbstractAction("Clear") {\r
74                 @Override\r
75                 public void actionPerformed(ActionEvent e) {\r
76                         base64TextArea.setText(null);\r
77                 }\r
78         };\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
84                 }\r
85                 public byte[] getBinary() {\r
86                         String text = headerLine.matcher(getText()).replaceAll("");\r
87                         return Base64.decodeBase64(text.getBytes());\r
88                 }\r
89                 public void setBinary(byte[] binary_data, String content_type, String filename) {\r
90                         if( binary_data != null && binary_data.length > 0 ) {\r
91                                 String header = "";\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
95                                         header += "\n";\r
96                                 }\r
97                                 setText(header + new String(Base64.encodeBase64Chunked(binary_data)) + "\n");\r
98                         }\r
99                 }\r
100         }\r
101         /**\r
102          * Base64テキスト入力ダイアログを構築します。\r
103          * @param midiEditor 親画面となるMIDIエディタ\r
104          */\r
105         public Base64Dialog(MidiEditor midiEditor) {\r
106                 this.midiEditor = midiEditor;\r
107                 setTitle("Base64-encoded MIDI sequence - " + ChordHelperApplet.VersionInfo.NAME);\r
108                 try {\r
109                         Base64.decodeBase64("".getBytes());\r
110                         base64Available = true;\r
111                 } catch( NoClassDefFoundError e ) {\r
112                         base64Available = false;\r
113                 }\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
123                                 }});\r
124                                 add(new JScrollPane(base64TextArea));\r
125                         }});\r
126                 }\r
127                 setBounds( 300, 250, 660, 300 );\r
128         }\r
129         private boolean base64Available;\r
130         /**\r
131          * {@link Base64} が使用できるかどうかを返します。\r
132          * @return Apache Commons Codec ライブラリが利用できる状態ならtrue\r
133          */\r
134         public boolean isBase64Available() {\r
135                 return base64Available;\r
136         }\r
137         /**\r
138          * バイナリー形式でMIDIデータを返します。\r
139          * @return バイナリー形式のMIDIデータ\r
140          */\r
141         public byte[] getMIDIData() {\r
142                 return base64TextArea.getBinary();\r
143         }\r
144         /**\r
145          * バイナリー形式のMIDIデータを設定します。\r
146          * @param midiData バイナリー形式のMIDIデータ\r
147          */\r
148         public void setMIDIData( byte[] midiData ) {\r
149                 base64TextArea.setBinary(midiData, null, null);\r
150         }\r
151         /**\r
152          * バイナリー形式のMIDIデータを、ファイル名をつけて設定します。\r
153          * @param midiData バイナリー形式のMIDIデータ\r
154          * @param filename ファイル名\r
155          */\r
156         public void setMIDIData( byte[] midiData, String filename ) {\r
157                 base64TextArea.setBinary(midiData, "audio/midi", filename);\r
158                 base64TextArea.selectAll();\r
159         }\r
160         /**\r
161          * Base64形式でMIDIデータを返します。\r
162          * @return  Base64形式のMIDIデータ\r
163          */\r
164         public String getBase64Data() {\r
165                 return base64TextArea.getText();\r
166         }\r
167         /**\r
168          * Base64形式のMIDIデータを設定します。\r
169          * @param base64Data Base64形式のMIDIデータ\r
170          */\r
171         public void setBase64Data( String base64Data ) {\r
172                 base64TextArea.setText(null);\r
173                 base64TextArea.append(base64Data);\r
174         }\r
175 }\r