OSDN Git Service

c43b13e6b0239aa00d2615098aac9359ddf24af6
[midichordhelper/MIDIChordHelper.git] / src / Base64Dialog.java
1 import java.awt.Dimension;\r
2 import java.awt.Insets;\r
3 import java.awt.event.ActionEvent;\r
4 import java.awt.event.ActionListener;\r
5 import java.util.regex.Pattern;\r
6 \r
7 import javax.swing.Box;\r
8 import javax.swing.BoxLayout;\r
9 import javax.swing.JButton;\r
10 import javax.swing.JDialog;\r
11 import javax.swing.JLabel;\r
12 import javax.swing.JPanel;\r
13 import javax.swing.JScrollPane;\r
14 import javax.swing.JTextArea;\r
15 \r
16 import org.apache.commons.codec.binary.Base64;\r
17 \r
18 /**\r
19  * Base64テキスト入力ダイアログ\r
20  */\r
21 public class Base64Dialog extends JDialog {\r
22         private static final Insets ZERO_INSETS = new Insets(0,0,0,0);\r
23         private Base64TextArea base64TextArea = null;\r
24         private JButton addBase64Button;\r
25         private JButton clearButton;\r
26         private boolean base64Available;\r
27         private static class Base64TextArea extends JTextArea {\r
28                 private static final Pattern headerLine =\r
29                         Pattern.compile( "^.*:.*$", Pattern.MULTILINE );\r
30                 public Base64TextArea(int rows, int columns) {\r
31                         super(rows,columns);\r
32                 }\r
33                 public byte[] getBinary() {\r
34                         String text = headerLine.matcher(getText()).replaceAll("");\r
35                         return Base64.decodeBase64(text.getBytes());\r
36                 }\r
37                 public void setBinary(byte[] binary_data, String content_type, String filename) {\r
38                         if( binary_data != null && binary_data.length > 0 ) {\r
39                                 String header = "";\r
40                                 if( content_type != null && filename != null ) {\r
41                                         header += "Content-Type: " + content_type + "; name=\"" + filename + "\"\n";\r
42                                         header += "Content-Transfer-Encoding: base64\n";\r
43                                         header += "\n";\r
44                                 }\r
45                                 setText(header + new String(Base64.encodeBase64Chunked(binary_data)) + "\n");\r
46                         }\r
47                 }\r
48         }\r
49         /**\r
50          * Base64テキスト入力ダイアログを構築します。\r
51          * @param midiEditor 親画面となるMIDIエディタ\r
52          */\r
53         public Base64Dialog(MidiEditor midiEditor) {\r
54                 this.midiEditor = midiEditor;\r
55                 setTitle("Base64-encoded MIDI sequence - " + ChordHelperApplet.VersionInfo.NAME);\r
56                 try {\r
57                         Base64.decodeBase64( "".getBytes() );\r
58                         base64Available = true;\r
59                 } catch( NoClassDefFoundError e ) {\r
60                         base64Available = false;\r
61                 }\r
62                 if( base64Available ) {\r
63                         add(new JPanel() {{\r
64                                 setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));\r
65                                 add(new JPanel() {{\r
66                                         setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS ));\r
67                                         add(new JLabel("Base64-encoded MIDI sequence:"));\r
68                                         add(Box.createRigidArea(new Dimension(10, 0)));\r
69                                         add(addBase64Button = new JButton(\r
70                                                 "Base64 Decode & Add to PlayList",\r
71                                                 new ButtonIcon(ButtonIcon.EJECT_ICON)\r
72                                         ) {{\r
73                                                 setMargin(ZERO_INSETS);\r
74                                                 setToolTipText("Base64デコードして、プレイリストへ追加");\r
75                                         }});\r
76                                         add(clearButton = new JButton("Clear") {{\r
77                                                 setMargin(ZERO_INSETS);\r
78                                         }});\r
79                                 }});\r
80                                 add(new JScrollPane(base64TextArea = new Base64TextArea(8,56)));\r
81                         }});\r
82                         addBase64Button.addActionListener(new ActionListener() {\r
83                                 @Override\r
84                                 public void actionPerformed(ActionEvent e) {\r
85                                         MidiEditor midiEditor = Base64Dialog.this.midiEditor;\r
86                                         int lastIndex = midiEditor.addSequence(getMIDIData(), null);\r
87                                         if( lastIndex < 0 ) {\r
88                                                 base64TextArea.requestFocusInWindow();\r
89                                                 lastIndex = midiEditor.sequenceListTableModel.getRowCount() - 1;\r
90                                         }\r
91                                         midiEditor.seqSelectionModel.setSelectionInterval(lastIndex, lastIndex);\r
92                                         setVisible(false);\r
93                                 }\r
94                         });\r
95                         clearButton.addActionListener(new ActionListener() {\r
96                                 @Override\r
97                                 public void actionPerformed(ActionEvent e) {\r
98                                         base64TextArea.setText(null);\r
99                                 }\r
100                         });\r
101                 }\r
102                 // setLocationRelativeTo(applet);\r
103                 setBounds( 300, 250, 660, 300 );\r
104         }\r
105         private MidiEditor midiEditor;\r
106         /**\r
107          * {@link Base64} が使用できるかどうかを返します。\r
108          * @return Apache Commons Codec ライブラリが利用できる状態ならtrue\r
109          */\r
110         public boolean isBase64Available() {\r
111                 return base64Available;\r
112         }\r
113         /**\r
114          * バイナリー形式でMIDIデータを返します。\r
115          * @return バイナリー形式のMIDIデータ\r
116          */\r
117         public byte[] getMIDIData() {\r
118                 return base64TextArea.getBinary();\r
119         }\r
120         /**\r
121          * バイナリー形式のMIDIデータを設定します。\r
122          * @param midiData バイナリー形式のMIDIデータ\r
123          */\r
124         public void setMIDIData( byte[] midiData ) {\r
125                 base64TextArea.setBinary(midiData, null, null);\r
126         }\r
127         /**\r
128          * バイナリー形式のMIDIデータを、ファイル名をつけて設定します。\r
129          * @param midiData バイナリー形式のMIDIデータ\r
130          * @param filename ファイル名\r
131          */\r
132         public void setMIDIData( byte[] midiData, String filename ) {\r
133                 base64TextArea.setBinary(midiData, "audio/midi", filename);\r
134                 base64TextArea.selectAll();\r
135         }\r
136         /**\r
137          * Base64形式でMIDIデータを返します。\r
138          * @return  Base64形式のMIDIデータ\r
139          */\r
140         public String getBase64Data() {\r
141                 return base64TextArea.getText();\r
142         }\r
143         /**\r
144          * Base64形式のMIDIデータを設定します。\r
145          * @param base64Data Base64形式のMIDIデータ\r
146          */\r
147         public void setBase64Data( String base64Data ) {\r
148                 base64TextArea.setText(null);\r
149                 base64TextArea.append(base64Data);\r
150         }\r
151 }\r