4 * Created on 2011/05/28, 18:14:51
6 package yukihane.inqubus.gui;
8 import java.awt.datatransfer.DataFlavor;
9 import java.awt.datatransfer.Transferable;
10 import java.awt.event.ItemEvent;
12 import java.util.Collection;
13 import java.util.List;
14 import java.util.regex.Matcher;
15 import java.util.regex.Pattern;
16 import javax.swing.TransferHandler;
17 import javax.swing.UIManager;
18 import javax.swing.UIManager.LookAndFeelInfo;
19 import org.apache.commons.io.FilenameUtils;
20 import yukihane.inqubus.conifg.Properties;
21 import yukihane.inqubus.model.Target;
22 import yukihane.inqubus.model.TargetsTableModel;
28 public class MainFrame extends javax.swing.JFrame {
30 private static final long serialVersionUID = 1L;
31 private final TargetsTableModel targetModel = new TargetsTableModel();
33 /** Creates new form MainFrame */
37 jPanel1.setTransferHandler(new DownloadListTransferHandler());
38 jTable1.setTransferHandler(new TableTransferHandler());
41 /** This method is called from within the constructor to
42 * initialize the form.
43 * WARNING: Do NOT modify this code. The content of this method is
44 * always regenerated by the Form Editor.
46 @SuppressWarnings("unchecked")
47 // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
48 private void initComponents() {
50 jPanel1 = new javax.swing.JPanel();
51 jScrollPane1 = new javax.swing.JScrollPane();
52 jTable1 = new javax.swing.JTable();
53 jPanel2 = new javax.swing.JPanel();
54 jButton2 = new javax.swing.JButton();
55 jButton3 = new javax.swing.JButton();
56 jButton4 = new javax.swing.JButton();
57 jPanel3 = new javax.swing.JPanel();
58 idLabel = new javax.swing.JLabel();
59 idField = new javax.swing.JTextField();
60 movieLabel = new javax.swing.JLabel();
61 useMovieLocalCheckBox = new javax.swing.JCheckBox();
62 movieFileField = new javax.swing.JTextField();
63 movieFileSelectButton = new javax.swing.JButton();
64 commentLabel = new javax.swing.JLabel();
65 useCommentLocalCheckBox = new javax.swing.JCheckBox();
66 commentFileField = new javax.swing.JTextField();
67 commentFileSelectButton = new javax.swing.JButton();
68 outputLabel = new javax.swing.JLabel();
69 outputConvertCheckBox = new javax.swing.JCheckBox();
70 outputFileField = new javax.swing.JTextField();
71 outputFileSelectButton = new javax.swing.JButton();
72 applyButton = new javax.swing.JButton();
73 jMenuBar1 = new javax.swing.JMenuBar();
74 jMenu1 = new javax.swing.JMenu();
75 jMenu2 = new javax.swing.JMenu();
77 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
79 jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
81 jTable1.setModel(targetModel);
82 jTable1.setDropMode(javax.swing.DropMode.INSERT_ROWS);
83 jScrollPane1.setViewportView(jTable1);
85 jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
87 jButton2.setText("開始");
89 jButton3.setText("停止");
91 jButton4.setText("選択解除");
93 javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
94 jPanel2.setLayout(jPanel2Layout);
95 jPanel2Layout.setHorizontalGroup(
96 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
97 .addGroup(jPanel2Layout.createSequentialGroup()
99 .addComponent(jButton2)
100 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
101 .addComponent(jButton3)
102 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 250, Short.MAX_VALUE)
103 .addComponent(jButton4)
106 jPanel2Layout.setVerticalGroup(
107 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
108 .addGroup(jPanel2Layout.createSequentialGroup()
110 .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
111 .addComponent(jButton2)
112 .addComponent(jButton3)
113 .addComponent(jButton4))
114 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
117 jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder());
119 idLabel.setText("ID");
121 movieLabel.setText("動画");
123 useMovieLocalCheckBox.setText("local");
124 useMovieLocalCheckBox.addItemListener(new java.awt.event.ItemListener() {
125 public void itemStateChanged(java.awt.event.ItemEvent evt) {
126 useMovieLocalCheckBoxItemStateChanged(evt);
130 movieFileSelectButton.setText("...");
132 commentLabel.setText("コメント");
134 useCommentLocalCheckBox.setText("local");
135 useCommentLocalCheckBox.addItemListener(new java.awt.event.ItemListener() {
136 public void itemStateChanged(java.awt.event.ItemEvent evt) {
137 useCommentLocalCheckBoxItemStateChanged(evt);
141 commentFileSelectButton.setText("...");
143 outputLabel.setText("出力");
145 outputConvertCheckBox.setText("変換");
146 outputConvertCheckBox.addItemListener(new java.awt.event.ItemListener() {
147 public void itemStateChanged(java.awt.event.ItemEvent evt) {
148 outputConvertCheckBoxItemStateChanged(evt);
152 outputFileSelectButton.setText("...");
154 applyButton.setText("適用");
156 javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
157 jPanel3.setLayout(jPanel3Layout);
158 jPanel3Layout.setHorizontalGroup(
159 jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
160 .addGroup(jPanel3Layout.createSequentialGroup()
162 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
163 .addGroup(jPanel3Layout.createSequentialGroup()
164 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
165 .addComponent(commentLabel)
166 .addComponent(movieLabel)
167 .addComponent(idLabel)
168 .addComponent(outputLabel))
169 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
170 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
171 .addGroup(jPanel3Layout.createSequentialGroup()
172 .addComponent(outputConvertCheckBox)
173 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
174 .addComponent(outputFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)
175 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
176 .addComponent(outputFileSelectButton))
177 .addGroup(jPanel3Layout.createSequentialGroup()
178 .addComponent(useCommentLocalCheckBox)
179 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
180 .addComponent(commentFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)
181 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
182 .addComponent(commentFileSelectButton))
183 .addGroup(jPanel3Layout.createSequentialGroup()
184 .addComponent(useMovieLocalCheckBox)
185 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
186 .addComponent(movieFileField, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE)
187 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
188 .addComponent(movieFileSelectButton))
189 .addComponent(idField, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
190 .addComponent(applyButton, javax.swing.GroupLayout.Alignment.TRAILING))
193 jPanel3Layout.setVerticalGroup(
194 jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
195 .addGroup(jPanel3Layout.createSequentialGroup()
197 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
198 .addComponent(idField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
199 .addComponent(idLabel))
200 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
201 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
202 .addComponent(movieLabel)
203 .addComponent(movieFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
204 .addComponent(movieFileSelectButton)
205 .addComponent(useMovieLocalCheckBox))
206 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
207 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
208 .addComponent(commentLabel)
209 .addComponent(commentFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
210 .addComponent(commentFileSelectButton)
211 .addComponent(useCommentLocalCheckBox))
212 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
213 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
214 .addComponent(outputLabel)
215 .addComponent(outputFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
216 .addComponent(outputFileSelectButton)
217 .addComponent(outputConvertCheckBox))
218 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
219 .addComponent(applyButton)
220 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
223 javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
224 jPanel1.setLayout(jPanel1Layout);
225 jPanel1Layout.setHorizontalGroup(
226 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
227 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
229 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
230 .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
231 .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE)
232 .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
235 jPanel1Layout.setVerticalGroup(
236 jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
237 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
239 .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)
240 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
241 .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
242 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
243 .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
247 jMenu1.setText("File");
248 jMenuBar1.add(jMenu1);
250 jMenu2.setText("Edit");
251 jMenuBar1.add(jMenu2);
253 setJMenuBar(jMenuBar1);
255 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
256 getContentPane().setLayout(layout);
257 layout.setHorizontalGroup(
258 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
259 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
261 layout.setVerticalGroup(
262 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
263 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
267 }// </editor-fold>//GEN-END:initComponents
269 private void useMovieLocalCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_useMovieLocalCheckBoxItemStateChanged
270 final boolean useLocal = (evt.getStateChange() == ItemEvent.SELECTED);
271 movieFileSelectButton.setEnabled(useLocal);
272 }//GEN-LAST:event_useMovieLocalCheckBoxItemStateChanged
274 private void useCommentLocalCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_useCommentLocalCheckBoxItemStateChanged
275 final boolean useLocal = (evt.getStateChange() == ItemEvent.SELECTED);
276 commentFileSelectButton.setEnabled(useLocal);
277 }//GEN-LAST:event_useCommentLocalCheckBoxItemStateChanged
279 private void outputConvertCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_outputConvertCheckBoxItemStateChanged
280 final boolean convert = (evt.getStateChange() == ItemEvent.SELECTED);
281 outputFileField.setEnabled(convert);
282 outputFileSelectButton.setEnabled(convert);
283 }//GEN-LAST:event_outputConvertCheckBoxItemStateChanged
286 * @param args the command line arguments
288 public static void main(String args[]) {
290 for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
291 if ("Nimbus".equals(info.getName())) {
292 UIManager.setLookAndFeel(info.getClassName());
296 } catch (Exception e) {
298 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
299 } catch (Exception ex) {
302 java.awt.EventQueue.invokeLater(new Runnable() {
305 new MainFrame().setVisible(true);
309 // Variables declaration - do not modify//GEN-BEGIN:variables
310 private javax.swing.JButton applyButton;
311 private javax.swing.JTextField commentFileField;
312 private javax.swing.JButton commentFileSelectButton;
313 private javax.swing.JLabel commentLabel;
314 private javax.swing.JTextField idField;
315 private javax.swing.JLabel idLabel;
316 private javax.swing.JButton jButton2;
317 private javax.swing.JButton jButton3;
318 private javax.swing.JButton jButton4;
319 private javax.swing.JMenu jMenu1;
320 private javax.swing.JMenu jMenu2;
321 private javax.swing.JMenuBar jMenuBar1;
322 private javax.swing.JPanel jPanel1;
323 private javax.swing.JPanel jPanel2;
324 private javax.swing.JPanel jPanel3;
325 private javax.swing.JScrollPane jScrollPane1;
326 private javax.swing.JTable jTable1;
327 private javax.swing.JTextField movieFileField;
328 private javax.swing.JButton movieFileSelectButton;
329 private javax.swing.JLabel movieLabel;
330 private javax.swing.JCheckBox outputConvertCheckBox;
331 private javax.swing.JTextField outputFileField;
332 private javax.swing.JButton outputFileSelectButton;
333 private javax.swing.JLabel outputLabel;
334 private javax.swing.JCheckBox useCommentLocalCheckBox;
335 private javax.swing.JCheckBox useMovieLocalCheckBox;
336 // End of variables declaration//GEN-END:variables
338 private void initInputPanel() {
341 final Properties p = Properties.INSTANCE;
343 final boolean movieLocal = p.getUseMovieFileLocal();
344 useMovieLocalCheckBox.setSelected(movieLocal);
345 movieFileSelectButton.setEnabled(movieLocal);
347 final boolean commentLocal = p.getCommentFileLocal();
348 useCommentLocalCheckBox.setSelected(commentLocal);
349 commentFileSelectButton.setEnabled(commentLocal);
351 final boolean convert = p.getOutputConvert();
352 outputConvertCheckBox.setSelected(convert);
353 outputFileField.setEnabled(convert);
354 outputFileField.setText(p.getOutputFile().toString());
355 outputFileSelectButton.setEnabled(convert);
359 private class DownloadListTransferHandler extends TransferHandler {
361 private static final long serialVersionUID = 1L;
362 private final Pattern movieIdPattern = Pattern.compile("(\\w\\w\\d+)");
365 public boolean canImport(TransferHandler.TransferSupport support) {
366 Transferable transferable = support.getTransferable();
367 if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
368 || transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
375 public boolean importData(TransferHandler.TransferSupport support) {
377 Transferable transferable = support.getTransferable();
378 if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
379 List<File> data = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
380 Collection<Target> targets = Target.from(data);
381 targetModel.addTarget(targets);
382 } else if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
383 String data = (String) transferable.getTransferData(DataFlavor.stringFlavor);
384 Matcher matcher = movieIdPattern.matcher(data);
385 if (matcher.find()) {
386 String movieId = matcher.group(1);
387 Target target = Target.fromId(movieId);
388 targetModel.addTarget(target);
395 } catch (Exception e) {
402 private class TableTransferHandler extends DownloadListTransferHandler {
405 public boolean canImport(TransferHandler.TransferSupport support) {
406 return super.canImport(support);
410 public boolean importData(TransferHandler.TransferSupport support) {
411 return super.importData(support);