OSDN Git Service

入力パネルの起動時の初期状態
[coroid/inqubus.git] / frontend / src / yukihane / inqubus / gui / MainFrame.java
1 /*
2  * MainFrame.java
3  *
4  * Created on 2011/05/28, 18:14:51
5  */
6 package yukihane.inqubus.gui;
7
8 import java.awt.datatransfer.DataFlavor;
9 import java.awt.datatransfer.Transferable;
10 import java.awt.event.ItemEvent;
11 import java.io.File;
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;
23
24 /**
25  *
26  * @author yuki
27  */
28 public class MainFrame extends javax.swing.JFrame {
29
30     private static final long serialVersionUID = 1L;
31     private final TargetsTableModel targetModel = new TargetsTableModel();
32
33     /** Creates new form MainFrame */
34     public MainFrame() {
35         initComponents();
36         initInputPanel();
37         jPanel1.setTransferHandler(new DownloadListTransferHandler());
38         jTable1.setTransferHandler(new TableTransferHandler());
39     }
40
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.
45      */
46     @SuppressWarnings("unchecked")
47     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
48     private void initComponents() {
49
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();
76
77         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
78
79         jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
80
81         jTable1.setModel(targetModel);
82         jTable1.setDropMode(javax.swing.DropMode.INSERT_ROWS);
83         jScrollPane1.setViewportView(jTable1);
84
85         jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
86
87         jButton2.setText("開始");
88
89         jButton3.setText("停止");
90
91         jButton4.setText("選択解除");
92
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()
98                 .addContainerGap()
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)
104                 .addContainerGap())
105         );
106         jPanel2Layout.setVerticalGroup(
107             jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
108             .addGroup(jPanel2Layout.createSequentialGroup()
109                 .addContainerGap()
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))
115         );
116
117         jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder());
118
119         idLabel.setText("ID");
120
121         movieLabel.setText("動画");
122
123         useMovieLocalCheckBox.setText("local");
124         useMovieLocalCheckBox.addItemListener(new java.awt.event.ItemListener() {
125             public void itemStateChanged(java.awt.event.ItemEvent evt) {
126                 useMovieLocalCheckBoxItemStateChanged(evt);
127             }
128         });
129
130         movieFileSelectButton.setText("...");
131
132         commentLabel.setText("コメント");
133
134         useCommentLocalCheckBox.setText("local");
135         useCommentLocalCheckBox.addItemListener(new java.awt.event.ItemListener() {
136             public void itemStateChanged(java.awt.event.ItemEvent evt) {
137                 useCommentLocalCheckBoxItemStateChanged(evt);
138             }
139         });
140
141         commentFileSelectButton.setText("...");
142
143         outputLabel.setText("出力");
144
145         outputConvertCheckBox.setText("変換");
146         outputConvertCheckBox.addItemListener(new java.awt.event.ItemListener() {
147             public void itemStateChanged(java.awt.event.ItemEvent evt) {
148                 outputConvertCheckBoxItemStateChanged(evt);
149             }
150         });
151
152         outputFileSelectButton.setText("...");
153
154         applyButton.setText("適用");
155
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()
161                 .addContainerGap()
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))
191                 .addContainerGap())
192         );
193         jPanel3Layout.setVerticalGroup(
194             jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
195             .addGroup(jPanel3Layout.createSequentialGroup()
196                 .addContainerGap()
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))
221         );
222
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()
228                 .addContainerGap()
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))
233                 .addContainerGap())
234         );
235         jPanel1Layout.setVerticalGroup(
236             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
237             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
238                 .addContainerGap()
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)
244                 .addGap(24, 24, 24))
245         );
246
247         jMenu1.setText("File");
248         jMenuBar1.add(jMenu1);
249
250         jMenu2.setText("Edit");
251         jMenuBar1.add(jMenu2);
252
253         setJMenuBar(jMenuBar1);
254
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)
260         );
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)
264         );
265
266         pack();
267     }// </editor-fold>//GEN-END:initComponents
268
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
273
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
278
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
284
285     /**
286      * @param args the command line arguments
287      */
288     public static void main(String args[]) {
289         try {
290             for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
291                 if ("Nimbus".equals(info.getName())) {
292                     UIManager.setLookAndFeel(info.getClassName());
293                     break;
294                 }
295             }
296         } catch (Exception e) {
297             try {
298                 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
299             } catch (Exception ex) {
300             }
301         }
302         java.awt.EventQueue.invokeLater(new Runnable() {
303
304             public void run() {
305                 new MainFrame().setVisible(true);
306             }
307         });
308     }
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
337
338     private void initInputPanel() {
339         idField.setText("");
340
341         final Properties p = Properties.INSTANCE;
342
343         final boolean movieLocal = p.getUseMovieFileLocal();
344         useMovieLocalCheckBox.setSelected(movieLocal);
345         movieFileSelectButton.setEnabled(movieLocal);
346
347         final boolean commentLocal = p.getCommentFileLocal();
348         useCommentLocalCheckBox.setSelected(commentLocal);
349         commentFileSelectButton.setEnabled(commentLocal);
350
351         final boolean convert = p.getOutputConvert();
352         outputConvertCheckBox.setSelected(convert);
353         outputFileField.setEnabled(convert);
354         outputFileField.setText(p.getOutputFile().toString());
355         outputFileSelectButton.setEnabled(convert);
356
357     }
358
359     private class DownloadListTransferHandler extends TransferHandler {
360
361         private static final long serialVersionUID = 1L;
362         private final Pattern movieIdPattern = Pattern.compile("(\\w\\w\\d+)");
363
364         @Override
365         public boolean canImport(TransferHandler.TransferSupport support) {
366             Transferable transferable = support.getTransferable();
367             if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
368                     || transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
369                 return true;
370             }
371             return false;
372         }
373
374         @Override
375         public boolean importData(TransferHandler.TransferSupport support) {
376             try {
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);
389                     } else {
390                         return false;
391                     }
392
393                 }
394                 return false;
395             } catch (Exception e) {
396                 e.printStackTrace();
397                 return false;
398             }
399         }
400     }
401
402     private class TableTransferHandler extends DownloadListTransferHandler {
403
404         @Override
405         public boolean canImport(TransferHandler.TransferSupport support) {
406             return super.canImport(support);
407         }
408
409         @Override
410         public boolean importData(TransferHandler.TransferSupport support) {
411             return super.importData(support);
412         }
413     }
414 }